[RISOLTO]Ordinamento matrice rispetto a una colonna?!

di il
45 risposte

45 Risposte - Pagina 3

  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Ripeto, a che gioco stiamo giocando?
    perchè qualche dubbio mi sta venendo,
    su cosa stiamo facendo, non su cosa dico io
    quindi, ripeto, a che gioco stiamo giocando?

    io sono l'ultimo arrivato, un programmatore giocattolo e sono le mie prime esperienze in 'C' su un PC
    ma leggere sono capace:

    ISO/IEC 9899:2011 (E)
    paragrafo 7.22.3
    "The order and contiguity of storage allocated by successive calls to the
    aligned_alloc, calloc, malloc, and realloc functions is unspecified. The
    pointer returned if the allocation succeeds is suitably aligned so that it may be assigned to
    a pointer to any type of object with a fundamental alignment requirement and then used
    to access such an object or an array of such objects in the space allocated (until the space
    is explicitly deallocated)."

    che dice esattamente quello che affermo io
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    La *singola* malloc ovviamente sì. Ma tutti i blocchi allocati non sono garantiti contigui, quindi non ti puoi spostare da uno all'altro come se fossero una sola zona di memoria.

    Guarda gli indirizzi generati dal semplice codice di una matrice 5 x 10
    
    	int **arr2d;
    	arr2d = (int **)malloc(5 * sizeof(int *));
    	printf("puntatore arr2d    %p ... %p\n", arr2d, arr2d+4);
    	for (int v = 0; v < 5; v++)
    	{
    		arr2d[v] = (int *)malloc(10 * sizeof(int));
    		printf("puntatore arr2d[%d] %p ... %p\n", v, arr2d[v], arr2d[v]+9);
    	}
    
    Infatti se leggi bene

    "The order and contiguity of storage allocated by successive calls to the
    aligned_alloc, calloc, malloc, and realloc functions is unspecified."


    Che vuol dire secondo te?
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Nippolo ha scritto:


    #include <stdio.h>
    #include <stdlib.h>
    
    #define RIGHE 2
    #define COLONNE 5
    
    void stampamatrice(int * matrix, int r, int c)
    {
       for(int i = 0; i < r; i++)
       {
          printf("\n");
    
          for(int j = 0; j < c; j++)
          {
             printf(" %2d ", *(matrix + i * c + j));
          }
       }
    }
    
    int main()
    {
       int **m = (int**)malloc(RIGHE * sizeof(int*));
       for(unsigned int i = 0; i < RIGHE; ++i)
       {
           m[i] = (int*)malloc(COLONNE * sizeof(int));
           for(unsigned int j = 0; j < COLONNE; ++j)
           {
               m[i][j] = i * COLONNE + j;
           }
       }
       stampamatrice(m[0], RIGHE, COLONNE);
    }
    torno a dire: a che gioco stai giocando?
    il tuo esempio non è un array polidimensionale, ma un array di puntatori a N array separati

    torno a dire che un (1, singolo) array di qualunque numero di dimensioni è contiguo
    quando avrai un controesempio lo posterai,
    in assenza io non gioco più
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    oregon ha scritto:


    La *singola* malloc ovviamente sì. Ma tutti i blocchi allocati non sono garantiti contigui, quindi non ti puoi spostare da uno all'altro come se fossero una sola zona di memoria.

    Guarda gli indirizzi generati dal semplice codice di una matrice 5 x 10

    Infatti se leggi bene

    "The order and contiguity of storage allocated by successive calls to the
    aligned_alloc, calloc, malloc, and realloc functions is unspecified."


    Che vuol dire secondo te?
    non mi diverte più seguirvi,
    di nuovo con array di array?
    ma ve lo siete inventato?
    lo ho scritto io?
    vi sembra che lo abbia scritto io?

    se leggete le "mie" parole bene
    se invece leggete quello che "volete" leggere per me sta bene lo stesso.......
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Weierstrass ha scritto:


    Ok questo può generare un array sparso. Ma la malloc unica è garantita contigua. Almeno così è negli os che ho controllato
    Ovviamente, altrimenti l'aritmetica dei puntatori non potrebbe essere applicata.
    Il punto è che se si parla di array multidimensionali allocati dinamicamente io penso a qualcosa come quello che ho appena postato. Il fatto poi che sfruttando l'aritmetica dei puntatori si possa simulare un array multidimensionale a partire da uno monodimensionale è un'altra questione (d'altronde credo che gli array statici multidimensionali siano ottenuti con una simile astrazione).

    StandardOil ha scritto:


    Ripeto, a che gioco stiamo giocando?
    perchè qualche dubbio mi sta venendo,
    su cosa stiamo facendo, non su cosa dico io
    quindi, ripeto, a che gioco stiamo giocando?

    io sono l'ultimo arrivato, un programmatore giocattolo e sono le mie prime esperienze in 'C' su un PC
    ma leggere sono capace:
    ...
    "Non si scomponga" cit.
    Cmq anche io sono un ragazzo che si è avvicinato alla programmazione dopo un banale esame di fondamenti di 6 crediti (che peraltro, come molti altri corsi, non ho mai seguito) e non ho mai letto libri al riguardo. Quel poco che so deriva da logica, tentativi e lettura di qualcosa su internet. Quindi non so rientro anche io nella categoria di "programmatore giocattolo" che ripeti tanto spesso!

    In ogni caso in risposta ai tuoi ultimi post:

    StandardOil ha scritto:


    ...
    E funziona per qualunque array bidimensionale (anche tri o poli)
    Sia esso statico, VLA o allocato dinamicamente
    ...
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Intanto se vuoi discutere puoi farlo con calma, senza continuare con questo "a che gioco state giocando" che è particolarmente irritante.
    Se vuoi si parla tranquillamente, altrimenti rimani tranquillamente delle tue opinioni.

    In secondo luogo, hai parlato tu di :
    Sia esso statico, VLA o allocato dinamicamente
    e quelli mostrati sono array allocati "dinamicamente".

    Vorrei capire come allochi dinamicamente tu un array bidimensionale.
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Dove avrei scritto che funziona su array di puntatori ad array?
    perchè non lo ho scrtto, e non mi diverte vedere che lo crediate
    per me array statico tridimensionale è questo:
    
    int array3d[3][4][5];
    
    per me array VLA è questo:
    
    int variabile;
    // qualche calcolo per avare il valore
    int arrayVLA[variabile];
    
    per me VLA multidimensionale è questo
    
    int VLA[random()%10][random()%10];
    
    più VLA di così non si può

    allocato dinamicamente invece è una (1 sola) malloc di dimensione adatta
    e adesso "vamos acabar com esta sujieria"
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    No. Se usi una sola malloc allochi un array ad una dimensione (un vettore). Quello che c'è dentro e come viene "interpretato" è del tutto irrilevante (una volta allocato in quel modo può essere interpretato come array a 2, a 3 o a 4 dimensioni senza che sia nessuno di questi).

    Se dici a qualcuno (che magari non ne sa molto) che quel metodo funziona con qualsiasi array allocato dinamicamente, dici una cosa non esatta.

    Avresti soltanto dovuto specificare

    "Sia esso statico, VLA o allocato dinamicamente solo se tramite vettore equivalente"

    In ogni caso, per me la questione si chiude qui. Non mi sembra fondamentale convincerti.
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    @StandardOil
    In linea di massima quello che avevo intenzione di scrivere coincide con quanto detto da @oregon nel precedente post... quindi inutile ripetersi!

    Aggiungo solo un paio di cose:
    - forse intendevi "sujeira"?
    - cerca di stare meno sulla difensiva... ad essere permalosi non si fa una bella figura!
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Mi spiace aver generato un po' di tensione. Siete tutti così gentili!
    da Weierstrass » 20 gen 2020, 23:28
    Raga ma buttatelo via sto benedetto DEV-C++.
    Hai ragione! Credo che non sia più supportato! Ma... all'università usano quello e finché non faccio l'esame (metà febbraio se Dio vuole). Appena posso passo del tutto a Code Block che ho sul portatile e gira benissimo.

    Passando al punto dolente. StandardOil ho capito che questa funzione è versatile e ti aiuta con tutta una serie di array e matrici. [A me interessano gli statici perché i dinamici non sono nel programma (immagino che saranno in Programmazione II)]:
    void stampa(int * matrice, int righe, int colonne)
    {
       for(int i = 0; i < righe; i++)
       {
          printf("riga %d -> ", i);
    
          for(int j = 0; j < colonne; j++)
          {
             printf("%2d ", * (matrice + i * colonne + j));
          }
    
          printf("\n");
       }
    }
    
    Conosco l'aritmetica dei puntatori (sebbene non credo di "padroneggiarla") ma cmq non capisco cosa significhi printf("%2d ", * (matrice + i * colonne + j)); Mi confonde il doppio segno * . Non capisco! Per me un puntatore è tipo int * sPtr;
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    @antragorn

    Non ti preoccupare: è una vecchia questione di definizioni, non hai generato tu la tensione. L'importante è capire bene cosa fa la malloc, ma poi lo vedrai nella seconda parte
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Il primo * è l'operatore unario (ossia agisce su un solo operando) di dereferenziazione, il secondo * è banalmente l'operatore binario (ossia agisce su due operandi) di moltiplicazione.
    Per quanto riguarda l'uso delle parentesi tonde bisogna conoscere la precedenza fra gli operatori. A tal proposito dai un'occhiata qui:
    http://www.bo.cnr.it/corsi-di-informatica/corsoCstandard/Lezioni/07Operatori.html
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    antragorn ha scritto:



    Conosco l'aritmetica dei puntatori (sebbene non credo di "padroneggiarla") ma cmq non capisco cosa significhi printf("%2d ", * (matrice + i * colonne + j)); Mi confonde il doppio segno * . Non capisco! Per me un puntatore è tipo int * sPtr;
    il doppio segno * confondeva anche me, quando tanti ma tanti anni fa ho studiato 'C'
    il primo, diciamo così "a vuoto" significa "il puntato da....." ovvero de-referenzia un puntatore
    il secondo, all'interno di una formula, è la semplice moltiplicazione

    all'inizio anch'io avevo difficoltà a "riconoscerli" tra di loro
    ma con un po' di abitudine diventa più facile

    mettiamo che debbo leggere l'intero alla riga 3, colonna 2 di un array di 4 colonne
    sarebbe array[3][2], scritto come array
    scritto come puntatore:
    io prendo un puntatore (il nome dell'array)
    gli sommo tante colonne quanto è la riga da leggere ovvero 4 * 3 (leggasi 4 per 3, non 4 puntatore 3) che fa 12
    gli sommo ancora la colonna da leggere ovvero 2
    e quindi il puntatore punta adesso all'oggetto di posto 14 (che viene da 12+2)
    e infatti se fai il conto diciamo così "sulle dita"
    la prima riga occupa gli oggetti da 0 a 3 (4 oggetti su 4 colonne)
    la seconda riga occupa gli oggetti da 4 a 7
    la terza gli oggetti da 8 a 11
    la quarta gli oggetti da 11 a 13
    dei quali il terzo è quello di colonna 2 (ti ricordo che in C gli indici cominciano da 0, quindi riga 3 è la quarta e colonna 2 è la terza)
    ovvero array[3][2] per un array di 4 colonne è il terzo oggetto della quarta riga ovvero il 14dicesimo
    e quindi il "puntato" da "puntatore + 14"

    tranquillo che col tempo ti viene automatico.........
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    antragorn ha scritto:


    Hai ragione! Credo che non sia più supportato! Ma... all'università usano quello e finché non faccio l'esame (metà febbraio se Dio vuole). Appena posso passo del tutto a Code Block che ho sul portatile e gira benissimo.
    cosa studi?
    è una domanda semi-interessata, il mio prediletto nipote studia ingegneria primo anno
    ma non gli hanno "imposto" alcun IDE o compilatore, anzi lo hanno più o meno lasciato allo stato "brado" a vagolare per cercare quale IDE era adatto

    e stato all'ora che sono passato da "giocare" con Arduino al 'C' su PC (linux)
    per dargli una mano a scegliere
    e alla fine abbiamo scelto geany

    più che altro perchè non sono riuscito a farne andare nessun altro........
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Che dire? Spettacolo!!! Più chiaro di così si muore!! Non resta che provare per impossessarsi della cosa! Sto imparando più qui da voi che altrove... E più passa il tempo e scopro cose nuove più mi piace l'informatica!

    Adesso vado a nanna; TNK e a domani.
Devi accedere o registrarti per scrivere nel forum
45 risposte