» »

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.

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

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 ":".

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:
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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C] LPC1343 - UART - AT commands

Oddelek: Programiranje
91139 (1029) JanezovJanez
»

[Java - DN] Naključna števila

Oddelek: Šola
121364 (893) nyler
»

Analiza kode: goto rabimo po pameti

Oddelek: Novice / Znanost in tehnologija
2913848 (10408) one too many
»

[C++] Delo s *.txt datotekami

Oddelek: Programiranje
192026 (1502) Tr0n
»

[C++] Functor za izračun osnovne statistike podatk. strukture (vector,list...)

Oddelek: Programiranje
91493 (1406) Vesoljc

Več podobnih tem