Forum » Programiranje » C - shranjevanje rezultatov iz baze v array
C - shranjevanje rezultatov iz baze v array
tadejp81 ::
Pozdravljeni.
Ker v C-ju nisem preveč domač in se trudim že lep čas s tem promlemom, se obračam na vas v upanju, da dobim kakšen koristen namig.
Funkcijo bi uporabil nekako na takšen način (predpostavimo, da je output funkcije getValues() nek array)
Vem, da je tukaj potrebno uporabit večdimenzijske arraye (če C sploh omogoča funkcije, ki imajo za izhod array-je), vendar se ne znajdem, ker nimam izkušenj s C-jem.
Prav bi mi prišel vsakršen namig.
Hvala in lep dan,
Tadej
Ker v C-ju nisem preveč domač in se trudim že lep čas s tem promlemom, se obračam na vas v upanju, da dobim kakšen koristen namig.
getValues() { MYSQL *conn; MYSQL_RES *res; MYSQL_ROW row; char *server = "localhost"; char *user = "root"; char *password = "pass"; char *database = "data"; conn = mysql_init(NULL); /* Connect to database */ if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } /* send SQL query */ if (mysql_query(conn, "SELECT * FROM `tabela`")) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } res = mysql_use_result(conn); int i = 0; while ((row = mysql_fetch_row(res)) != NULL) { output = row[0]; // V OUTPUT SE MORAJO BELEŽITI VREDNOSTI VSEH VRSTIC TABELE 1. STOLPCA (row[0]) i++; } mysql_free_result(res); mysql_close(conn); return output; }
Funkcijo bi uporabil nekako na takšen način (predpostavimo, da je output funkcije getValues() nek array)
char values = getValues(); for(int i = 0; i < dolžina(values); i++) { printf("%d. vrstica v stolpcu 1 = %s", i, values[i]); }
Vem, da je tukaj potrebno uporabit večdimenzijske arraye (če C sploh omogoča funkcije, ki imajo za izhod array-je), vendar se ne znajdem, ker nimam izkušenj s C-jem.
Prav bi mi prišel vsakršen namig.
Hvala in lep dan,
Tadej
Randomness ::
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> typedef struct { char** rows; size_t size; } Result; Result get_result(size_t size) { Result result; result.rows = (char**)malloc(size * sizeof(char*)); assert(result.rows); char tmp[256]; for (size_t i = 0; i < size; i++) { int retval = snprintf(tmp, 256, "row %ld", i + 1); assert(retval < 256); result.rows[i] = strdup(tmp); } result.size = size; return result; } void print_result(const Result* r) { for (size_t i = 0; i < r->size; i++) { printf("%s\n", r->rows[i]); } } void destroy_result(Result* r) { for (size_t i = 0; i < r->size; i++) free(r->rows[i]); free(r->rows); } int main() { Result result = get_result(42); print_result(&result); destroy_result(&result); }Tole je stari dobri C, v C++ bi bilo vse skupaj malo krajše.
srus ::
Takole na hitro:
- vrstico 23 je verjetno potrebno spremeniti v output[i] = row[0];
- domnevam, da se v prvem stolpcu nahajajo številske vrednosti (int), ki jih lahko prirejaš in ne npr. stringi
- polje output moraš nekje deklarirati npr. int output [100], če pričakuješ do 100 rezultatov
- values mora biti potem tipa pointer na int npr. int * values
- C ne omogoča prenosov nizov kot parametrov, ob prenosu moraš uporabiti kazalce na nize
- ravno tako moraš dolžina(values) rešiti na kakšen drug način, npr. dolžino niza na koncu funkcije zapišeš v zadnji element polja output[ 100 ] = i
- vrstico 23 je verjetno potrebno spremeniti v output[i] = row[0];
- domnevam, da se v prvem stolpcu nahajajo številske vrednosti (int), ki jih lahko prirejaš in ne npr. stringi
- polje output moraš nekje deklarirati npr. int output [100], če pričakuješ do 100 rezultatov
- values mora biti potem tipa pointer na int npr. int * values
- C ne omogoča prenosov nizov kot parametrov, ob prenosu moraš uporabiti kazalce na nize
- ravno tako moraš dolžina(values) rešiti na kakšen drug način, npr. dolžino niza na koncu funkcije zapišeš v zadnji element polja output[ 100 ] = i
tadejp81 ::
Randomness, nekaj bo narobe. Ko dam prevajat dobim napako...
gcc -o test5 test5.c
test5.c: In function 'get_result':
test5.c:17:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for (size_t i = 0; i < size; i++) {
^
test5.c:17:5: note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to c ompile your code
test5.c: In function 'print_result':
test5.c:29:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for (size_t i = 0; i < r->size; i++) {
^
test5.c: In function 'destroy_result':
test5.c:35:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for (size_t i = 0; i < r->size; i++)
^
root@virtualec:/var/www/html/test# gcc -o test5 test5.c
test5.c: In function 'get_result':
test5.c:17:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for (size_t i = 0; i < size; i++) {
^
test5.c:17:5: note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code
test5.c: In function 'print_result':
test5.c:29:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for (size_t i = 0; i < r->size; i++) {
^
test5.c: In function 'destroy_result':
test5.c:35:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for (size_t i = 0; i < r->size; i++)
^
srus, v prvem stolpcu se nahajajo stringi, v mojem primeru MAC naslovi naprav ločeni z ":".
gcc -o test5 test5.c
test5.c: In function 'get_result':
test5.c:17:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for (size_t i = 0; i < size; i++) {
^
test5.c:17:5: note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to c ompile your code
test5.c: In function 'print_result':
test5.c:29:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for (size_t i = 0; i < r->size; i++) {
^
test5.c: In function 'destroy_result':
test5.c:35:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for (size_t i = 0; i < r->size; i++)
^
root@virtualec:/var/www/html/test# gcc -o test5 test5.c
test5.c: In function 'get_result':
test5.c:17:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for (size_t i = 0; i < size; i++) {
^
test5.c:17:5: note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code
test5.c: In function 'print_result':
test5.c:29:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for (size_t i = 0; i < r->size; i++) {
^
test5.c: In function 'destroy_result':
test5.c:35:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for (size_t i = 0; i < r->size; i++)
^
srus, v prvem stolpcu se nahajajo stringi, v mojem primeru MAC naslovi naprav ločeni z ":".
Zgodovina sprememb…
- spremenil: tadejp81 ()
tadejp81 ::
Randomness, napako pri prevajanju sem odpravil. Moj prevajalnik je zahteval, da deklariraš spremenljivke pred for zanko. Preverjam naprej...
Randomness ::
Verjetno uporabljaš starejšo verzijo gcc-ja. Poženi gcc -v, da vidimo, katero verzijo gcc-ja imaš. Prevajalniku lahko podaš tudi opcijo '-std=gnu11'.
tadejp81 ::
Gcc imam verzije - gcc version 4.9.2 (Debian 4.9.2-10)
Sedaj sem pa to uredil na način, da se "i" deklariral pred for zanko:
Zadeva skupaj z integriranim mojim mysql delom tudi deluje super, sem sedaj preveril.
Res hvala ti!
Pozdrav, Tadej
Sedaj sem pa to uredil na način, da se "i" deklariral pred for zanko:
for (size_t i = 0; i < r->size; i++) {}
size_t i; for (i = 0; i < r->size; i++) {}
Zadeva skupaj z integriranim mojim mysql delom tudi deluje super, sem sedaj preveril.
Res hvala ti!
Pozdrav, Tadej
Randomness ::
Malenkost. Drugače pa C89 res ne omogoča deklaracije spremenljivk znotraj for stavka. gcc 4.9.2 očitno privzeto uporablja še ta standard - če želiš uporabiti novejši standard, moraš gcc-ju v tvojem primeru podati opcijo -std.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C] LPC1343 - UART - AT commandsOddelek: Programiranje | 1087 (977) | JanezovJanez |
» | [Java - DN] Naključna številaOddelek: Šola | 1341 (870) | nyler |
» | Analiza kode: goto rabimo po pametiOddelek: Novice / Znanost in tehnologija | 13690 (10250) | one too many |
» | [C++] Delo s *.txt datotekamiOddelek: Programiranje | 1997 (1473) | Tr0n |
» | [C++] Functor za izračun osnovne statistike podatk. strukture (vector,list...)Oddelek: Programiranje | 1460 (1373) | Vesoljc |