Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [C] muovere un puntatore e riallocare

    Salve a tutti.
    Ieri mi sono imbattuto in uno strano errore mentre cercavo di fare la seguente operazione:
    dato un array di 5 interi, diciamo questo:
    codice:
    int i = 0,
        length = 5,
        *array = malloc(length * sizeof(int));
    while(i < length)
        array[i] = i++;
    vorrei compiere la seguente operazione: spostarmi in avanti, e mettere il primo valore in fondo.
    Da una coppia index/valori come questa:
    codice:
    0,1,2,3,4
    0,1,2,3,4
    vorrei ottenere questa
    codice:
    0,1,2,3,4
    1,2,3,4,0
    Il codice che ho utilizzato e' il seguente:
    codice:
    int j = array[0];
    ++array; // o array++
    array[length - 1] = j;
    Il suddetto codice funziona perfettamente, ma solo fino a tot numeri.
    Se l'array e' composto da 50 elementi, ad un certo punto il programma termina (a volte anche no) senza errori o altro.
    Non ricordando bene il C, ma ragionandoci sopra, ho dedotto il problema fosse della memoria allocata e relativo indirizzo, dove spostando il puntatore mi muovo verso il limite della memoria allocata, e quando il loop ripete se stesso dopo essere giunto alla fine degli spostamenti, si crea il problema.

    Convinto di questo, ho provato a riutilizzare sia realloc, che malloc, ma ho sia comportamenti anomali, ad esempio se uso altri puntatori / array che impazziscono se dichiarati dopo quello sulla quale opero, che errori di sistema di ogni tipo.

    Alche', non avendo trovato molto in rete, mi fermo e chiedo a voi che C lo usate tutti i giorni, a differenza di me che l'ho dimenticato al 99%
    Grazie per ogni eventuale consiglio
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    No ... questo codice

    codice:
    int j = array[0];
    ++array; // o array++
    array[length - 1] = j;
    non è corretto ...

    In ogni caso, perche' hai scritto

    *array = malloc(length * sizeof(int));

    ?

    Come hai dichiarato array ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    speriamo che sia un doppio puntatore.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    Originariamente inviato da oregon
    Come hai dichiarato array ?
    l'ho scritto all'inizio ...
    codice:
    int i = 0,
        length = 5,
        *array = malloc(length * sizeof(int));
    while(i < length)
        array[i] = i++;
    quale parte non e' corretta? :master:
    No perche' funziona perfettamente finche' non comincio a spostarmi in avanti ripetutamente col puntatore ...
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da andr3a
    l'ho scritto all'inizio ...
    Allora te lo chiedo nuovamente ... qual e' la dichiarazione della variabile array?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    intendi questa?
    codice:
    int *array = malloc(length * sizeof(int));
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Sì ... quindi, hai scritto

    int *array = malloc(length * sizeof(int));

    oppure

    *array = malloc(length * sizeof(int));

    ??

    Se fa parte tutto dello stesso codice, faccelo capire ... due malloc sono sbagliate e la seconda lo e' di piu' ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    ah, quindi secondo te c'e' differenza tra questo codice:
    codice:
    int i = 0,
        length = 5,
        *array = malloc(length * sizeof(int));
    e questo
    codice:
    int i = 0;
    int length = 5;
    int *array = malloc(length * sizeof(int));
    ...
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non avevo letto le , ... sembrava che *array fosse un doppio puntatore ...

    Comunque, per migliore leggibilita' scriverei

    int i = 0, length = 5, *array = malloc(length * sizeof(int));

    ma per evitare problemi con alcuni compilatori, e' meglio

    int i = 0, length = 5;
    int *array = (int *)malloc(length * sizeof(int));

    Okay ... quindi, questa parte di codice

    int j = array[0];
    ++array; // o array++
    array[length - 1] = j;
    e' quella che non va ... ovvero

    ++array; // o array++

    non sposta i dati ... o usi la memcpy o un ciclo for ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    no, quella parte va ... ok, questo e' un esempio completo di quello che sto cercando di fare:
    codice:
    int i = 0,
        j = 0,
        length = 5,
        *array = malloc(length * sizeof(int));
    while(i < length)
        array[i] = i++;
    while(length){
        i = 0;
        while(i++ < length){
            j = array[0];
            array++;
            array[length - 1] = j;
        }
        for(i = 0; i < length; i++)
            printf("%i ", array[i]);
        printf("\n");
        array++;
        length--;
    }
    lo so che puo' sembrare strano, ma mi serve farlo ... ed il problema nasce quando metto length a 100, 1000 o 3000 ... ma non sono riuscito a risolvere.
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

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 © 2025 vBulletin Solutions, Inc. All rights reserved.