Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372

    [utilizzo dei membri di un array di strutture]

    non sò se ho azzeccato il titolo, questo è il quesito: data una struttura è possibile accedere ai vari MEMBRI in un ciclo for per il nr dei membri presenti? Ossia:

    struct elenco{
    char *campo1;
    char *campo2;
    } ELENCO;

    ELENCO vElenco[10];

    for (int i=0; i<10; i++){
    for (int x=1; x<2; x++){
    VElenco[i].campo[x]="....."; --> ovviamente questo errato, perchè non esite un membro CAMPO ... ma per farvi capire
    }
    }

    ... lo scopo è quello di scrivere poco codice

    che soluzione suggerite in merito?????

  2. #2
    se ho ben capito vuoi sapere se la riga di assegnazione interna ai for è corretta... si è giusta, ma io riscriverei così:
    codice:
    ELENCO vElenco[10];
    
    for (int i=0; i<10; i++) {
            //devi inizializzare l'array di char se non vuoi andare in segmentation fault
            //durante l'assegnamento
            vElenco[i].campo1 = (char*)calloc(2, sizeof(char));
            for (int x=0; x<2; x++) //se vuoi scrivere dal primo elemento devi partire da 0
                    vElenco[i].campo1[x]='a';
    }
    comunque dettagli a parte è giusto.
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372
    Originariamente inviato da GreyFox86
    se ho ben capito vuoi sapere se la riga di assegnazione interna ai for è corretta... si è giusta, ma io riscriverei così:
    codice:
    ELENCO vElenco[10];
    
    for (int i=0; i<10; i++) {
            //devi inizializzare l'array di char se non vuoi andare in segmentation fault
            //durante l'assegnamento
            vElenco[i].campo1 = (char*)calloc(2, sizeof(char));
            for (int x=0; x<2; x++) //se vuoi scrivere dal primo elemento devi partire da 0
                    vElenco[i].campo1[x]='a';
    }
    comunque dettagli a parte è giusto.
    ... no non intendevo così: avendo 4 membri un ciclo dal primo al quarto ....

    ed avevo fatto l'esempio che da errore dove x e la var del ciclo for ...

    vElenco[i].membro[x]='a';

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372
    seguendo il tuo esempio ho fatto delle prove:

    nella struttura i membri sono stati definiti come const char*:

    l'assegnazione vElenco[i].campo1[x]='a'; produce ovviamente un warning: multi-character character constant;

    l'assegnazione vElenco[i].campo1[x]="a"; produce l'errore invalid conversion from `const char*' to `char' perchè indicato [x]

    quindi non è possibile accedere ai membri che compongono la singola riga dell'array di strutture se non indicandone singolarmente il loro nome

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: [utilizzo dei membri di un array di strutture]

    Originariamente inviato da stefanoB
    che soluzione suggerite in merito?????
    Perché non fare:
    codice:
    struct elenco{
    char *campi[2];
    } ELENCO;
    ?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #6
    Originariamente inviato da stefanoB
    nella struttura i membri sono stati definiti come const char*:

    l'assegnazione vElenco[i].campo1[x]='a'; produce ovviamente un warning: multi-character character constant;

    l'assegnazione vElenco[i].campo1[x]="a"; produce l'errore invalid conversion from `const char*' to `char' perchè indicato [x]
    Se hai definito i membri come const allora perchè il compilatore non ti indica che stai cercando di assegnare dei valori a delle costanti?

    Vedo che fai un po' di confusione tra apici singoli e virgolette... gli apici servono per dichiarare una costante char (da assegnare ad una variabile char o per farne quello che ti pare) ed il valore che rappresenta è sempre e solo quello del carattere. Quando usi le virgolette stai indicando una stringa non un carattere, e quindi di conseguenza è sottinteso che alla fine verrà inserito un terminatore di stringa \0.
    Quindi: il warning non puoi averlo ottenuto con quell'assegnazione ma piuttosto con qualcosa del tipo:
    vElenco[i].campo1[x]='ab'
    dove specifichi più caratteri quando dovresti indicarne solo uno, mentre l'errore di conversione da puntatore a char a char è evidentemente una causa delle virgolette: stai assegnando la stringa "a" (e non il carattere) ad un char, ma assegnare una stringa significa assegnare il puntatore al primo elemento. Da qui l'errore di conversione.
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372
    Originariamente inviato da GreyFox86
    Se hai definito i membri come const allora perchè il compilatore non ti indica che stai cercando di assegnare dei valori a delle costanti?

    Vedo che fai un po' di confusione tra apici singoli e virgolette... gli apici servono per dichiarare una costante char (da assegnare ad una variabile char o per farne quello che ti pare) ed il valore che rappresenta è sempre e solo quello del carattere. Quando usi le virgolette stai indicando una stringa non un carattere, e quindi di conseguenza è sottinteso che alla fine verrà inserito un terminatore di stringa \0.
    Quindi: il warning non puoi averlo ottenuto con quell'assegnazione ma piuttosto con qualcosa del tipo:
    vElenco[i].campo1[x]='ab'
    dove specifichi più caratteri quando dovresti indicarne solo uno, mentre l'errore di conversione da puntatore a char a char è evidentemente una causa delle virgolette: stai assegnando la stringa "a" (e non il carattere) ad un char, ma assegnare una stringa significa assegnare il puntatore al primo elemento. Da qui l'errore di conversione.
    No, ho ben chiaro la differenza tra costante char e stringa, quindi apici e virgolette (vedere mio 1° post) e questo benedetto vElenco[i].campo1[x]='a'; è venuto da un precedente suggerimento mentre i membri sono delle costanti e quindi è ok che il warning è avvento con vElenco[i].campo1[x]='ab' (credo di aver riportato male durante le prove) ...

    comunque quello che non mi è chiaro e che ancora non mi avete spiegato è che avendo dei membri costant char definiti in campo1, campo2 ... un assegnazione (precedentemente suggerita) in un for del tipo

    for (int x=0; x<2; x++) { //se vuoi scrivere dal primo elemento devi partire da 0
    vElenco[i].campo1[x]='a';
    }

    come fa ad assegnare valori ai vari membri se è indicato ... campo1[x]

    e quindi nuovamente rispondo che non è possibile valorizzare i membri se non indicandone singolarmente ed espressamente il loro nome!

  8. #8
    Originariamente inviato da stefanoB
    No, ho ben chiaro la differenza tra costante char e stringa, quindi apici e virgolette (vedere mio 1° post) e questo benedetto vElenco[i].campo1[x]='a'; è venuto da un precedente suggerimento mentre i membri sono delle costanti e quindi è ok che il warning è avvento con vElenco[i].campo1[x]='ab' (credo di aver riportato male durante le prove) ...
    Allora vediamo di spiegare chiaramente:

    'a', 'b', 'x', '#', '(', '%' e quant'altro sono costanti char. Il valore che portano non è altro che un solo byte, indicante il singolo codice ascii che rappresenta il carattere tra gli apici. Visto che 'a' in ascii è 97 (non ricordo se maiuscolo o minuscolo ma è sempre una a) potresti per esempio scrivere anche 97 al posto di 'a'. I char sono caratteri singoli, non possono rappresentare stringhe da soli.

    "stringa1", "mia stringa", "altra stringa", "c" sono tutte stringhe, cioè array di char. Per le prime tre è più evidente perchè si indicano una serie di caratteri, ma anche l'ultima lo è. "c" non può essere assegnata ad un singolo char perchè in quanto stringa, è rappresentata da un array, e "c" non è altro che un puntatore al primo elemento dell'array.
    "c" è un char*
    'c' è un char
    Pertanto nel momento in cui tu scrivi "c" al posto di 'c' nel caso volessi assegnare un valore ad una variabile char commetteresti un errore di tipo.
    Se comunque non ti rimane chiaro ti consiglio di andare leggerti qualche documentazione del C.

    Originariamente inviato da stefanoB
    comunque quello che non mi è chiaro e che ancora non mi avete spiegato è che avendo dei membri costant char definiti in campo1, campo2 ... un assegnazione (precedentemente suggerita) in un for del tipo

    for (int x=0; x<2; x++) { //se vuoi scrivere dal primo elemento devi partire da 0
    vElenco[i].campo1[x]='a';
    }

    come fa ad assegnare valori ai vari membri se è indicato ... campo1[x]

    e quindi nuovamente rispondo che non è possibile valorizzare i membri se non indicandone singolarmente ed espressamente il loro nome!
    Il punto è che se definisci i membri come "const char" che io sappia non puoi assegnarci niente visto che sono costanti. Togli il const e potrai assegnarci valori normalmente come hai indicato. Spero di aver risposto alla tua domanda visto che non mi è molto chiara.
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372
    Spero di aver risposto alla tua domanda visto che non mi è molto chiara.
    ... infatti leggi il mio post di apertura della discussione (il 1°) e guarda lo script,
    perchè credo ti sei attrigato .... comque ho utilizzato una soluzione diversa evitando le strutture.

  10. #10
    Ah be allora tutto a posto
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.