Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182

    [c] strano errore puntatore

    In questo codice mi viene sollevato il [Warning] assignment from incompatible pointer type [enabled by default] relativo all'assegnamento
    codice:
    p=a
    nel ciclo for.perchè?Il nome dell array non corrisponde ad un indirizzo?





    codice:
    #include <stdio.h>
    #define NUM_ROWS 4
    #define NUM_COLS 4
    
    
    int main(){
    int *p;
    int a[NUM_ROWS][NUM_COLS];
    
    for (p=a;p<a[NUM_ROWS-1]+(NUM_COLS-1);p++){
        *p=0;
    }
    }

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    a è un int** metre p un int*
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Comunque si, è solo un indirizzo di memoria e volendo puoi assignare a a p, il compilatore ti avverte giustamente perchè spesso si ttratta di un errore.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182
    Grazie

  5. #5
    Originariamente inviato da Scara95
    a è un int** metre p un int*
    Questa è una sciocchezza.
    a è un array, e come tutti gli array può decadere in un puntatore al suo primo elemento; il puntatore al primo elemento di un int[NUM_ROWS][NUM_COLS] ha tipo int (*)[NUM_COLS], che non può essere convertito implicitamente in un int *, da cui l'errore.
    Gli array multidimensionali e il "trucco" con cui si possono costruire delle "specie" di array multidimensionali sono due cose completamente diverse. Leggi qui.

    In ogni caso, la cosa più corretta da scrivere è:
    codice:
    p=a[0]
    infatti:
    - a decade in un int(*)[NUM_COLS];
    - a[0] (o anche *a) dereferenzia il tipo sopra specificato, e ottiene quindi il primo elemento dell'array multidimensionale, ovvero la prima riga, che ha tipo int[NUM_COLS];
    - la prima riga quindi è un array monodimensionale, che pertanto decade in un puntatore al suo primo elemento, ovvero un int *.

    Puoi quindi indirizzare tutto l'array multidimensionale tramite quel puntatore perché lo standard garantisce che gli elementi di un array multidimensionale sono contigui e ordinati per riga.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Originariamente inviato da MItaly
    Questa è una sciocchezza.
    Non è una sciocchezza! Essendo un linguaggio tipizzato i tipi sarebbero da seguire e considerare!
    Se poi leggi il post subito seguente ho anche scritto che si poteva fare, tuttavia non avevo il tempo di spiegare tutto nei dettagli come tu hai fatto!


    L'array multidimensionale è solo simulato:
    a[x][y] = a[x*n+y] con 0 <= y < n e x >= 0

    Ma questo non vuol dire che non sia il caso di rispettare i tipi del linguaggio.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Originariamente inviato da Scara95
    Non è una sciocchezza! Essendo un linguaggio tipizzato i tipi sarebbero da seguire e considerare!
    Non è una sciocchezza il warning (anzi, a mio avviso dovrebbe essere considerato un errore), è una sciocchezza quello che hai detto tu, ovvero che a è un int**. Come già detto, a è un int[NUM_ROWS][NUM_COLS] che decade in un int(*)[NUM_COLS], e non puoi ottenere un int** da a con nessun cast valido, per il semplice fatto che a non ha dentro da nessuna parte un vettore di puntatori alle righe dell'array.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Sì, scusa, hai ragione, ho cannato completamente... Per int** intendevo int*[n] e il bello è che ero convinto!
    Ecco cosa succede quando si fa qualcosa pensando e facendo dell'altro
    Fatto sta che, come ho già detto e come hai detto anche tu, MItaly, questi warning non andrebbero affatto presi alla leggera!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Occhio: non int *[n] (array di n puntatori ad int), ma int (*) [n] (puntatore ad un array di n int).
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Originariamente inviato da MItaly
    Occhio: non int *[n] (array di n puntatori ad int), ma int (*) [n] (puntatore ad un array di n int).
    Ok, è meglio che eviti di rispondere ancora.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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.