PROBLEMA visual studio code alcuni messaggi.

BigIssue

Utente Attivo
221
18
CPU
intel dual core n3050
Scheda Madre
asus x540s
RAM
4gb
GPU
intel HD
OS
Windows 10
Unable to open 'strlen.S': Unable to read file '/build/glibc-S9d2JN/glibc-2.27/sysdeps/x86_64/strlen.S' (Error: Unable to resolve non-existing file '/build/glibc-S9d2JN/glibc-2.27/sysdeps/x86_64/strlen.S').

Ho risolto questi problemi in questo modo:
Bash:
cd /
mkdir build
sudo mkdir glibc-S9d2JN
cd glibc-S9d2JN/
sudo wget http://ftp.gnu.org/gnu/glibc/glibc-2.27.tar.gz
sudo tar -xzvf glibc-2.27.tar.gz

Ora mi prende tutti i file della libreria.
 

BigIssue

Utente Attivo
221
18
CPU
intel dual core n3050
Scheda Madre
asus x540s
RAM
4gb
GPU
intel HD
OS
Windows 10
Niente da fare. Sapete darmi una dritta.​

In C non riesco a ridimensionare con i puntatori un array di int multidimensionale ROW*COLUMN.
Vorrei in pratica che l'array dinamico quindi creato con la malloc, possa passare da 3 ROW e 5 COLUMN di elementi a 6 ROW e 7 COLUMN elementi int.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Che codice hai scritto?
In sostanza devi fare una realloc per le righe e poi in un ciclo le realloc per le colonne. In pratica è la stessa logica che usi per allocare la memoria quando crei la matrice.
 

BigIssue

Utente Attivo
221
18
CPU
intel dual core n3050
Scheda Madre
asus x540s
RAM
4gb
GPU
intel HD
OS
Windows 10
E adesso il codice è un po pasticciato. Lo sistemo e faccio il post sul forum.
 

BigIssue

Utente Attivo
221
18
CPU
intel dual core n3050
Scheda Madre
asus x540s
RAM
4gb
GPU
intel HD
OS
Windows 10
C:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


#define ROW 2
#define COLUMN 4


int main()
{
    int size,i,l,t,e;


    int rows = 2;
    int cols = 5;
    int chars = 20;


    int newrows;
    char ***table = malloc(rows * sizeof(char **));
    //alloco le righe
    for (i = 0; i < rows; i++)
        table[i] = malloc(cols * sizeof(char *));


    //alloco ogni cella riga-colonna
    for(i = 0; i < rows; i++)
        for(l = 0; l < cols; l++)
            table[i][l] = malloc(sizeof(char));


    strcpy(table[0][0],"00");
    strcpy(table[0][0],"00");
    strcpy(table[0][1],"01");
    strcpy(table[0][2],"02");
    strcpy(table[0][3],"03");
    strcpy(table[0][4],"04");
    strcpy(table[1][0],"10");
    strcpy(table[1][1],"11");
    strcpy(table[1][2],"12");
    strcpy(table[1][3],"13");
    strcpy(table[1][4],"14");
    //strcpy(table[2][0],"14"); //se decoentata va in errore di spazio seg fault


    for (i = 0; i < rows; i++)
        for(l=0;l< cols; l++)
        {
            if( (cols - 1) == l)
                printf("%s\t\n",table[i][l]);
            else
                printf("%s\t",table[i][l]);
        }


    newrows = rows + 3;
    //aumento il numero di righe
    table = realloc(table,newrows * sizeof(char **));

    table[2][0] = "01234567890123456789"; //DOVREBBE NON ANDARE IN ERRORE perchè ce piu spazio
    printf("caratteri: %s\n",table[0][0]);
    printf("Hello world!\n");
    return 0;
}
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Non è una matrice di interi quindi, è una matrice di char.

Comunque:
C:
    table = realloc(table,newrows * sizeof(char **));

    table[2][0] = "01234567890123456789"; //DOVREBBE NON ANDARE IN ERRORE perchè ce piu spazio

darà errore sicuramente, in quanto non hai allocato memoria per table[2]. Devi fare una malloc su questo elemento quindi.

C:
    table = realloc(table,newrows * sizeof(char**));
    table[2] = malloc( cols*sizeof(char*));
    
    for(int i=0; i<cols; i++)
        table[2][i] = "01234567890123456789";

rifacendo il ciclo che hai usato tu, ma con rows+1, ottieni:
Codice:
00      01      02      03      04
10      11      12      13      14
00      01      02      03      04
10      11      12      13      14
01234567890123456789    01234567890123456789    01234567890123456789    01234567890123456789    01234567890123456789

Hello world!
 

BigIssue

Utente Attivo
221
18
CPU
intel dual core n3050
Scheda Madre
asus x540s
RAM
4gb
GPU
intel HD
OS
Windows 10
A ma non dovrebbe farlo la realloc? Se realloco la memoria per le righe forse non è detto che alloc la memoria per la singola riga.
Quindi i puntatori alle colonne non modifica la dimensione.

grazie, ci sto mettendo delle ore per capire tutti i concetti e come si è notato di creare la fantomatica tabella dinamica intanto di stringhe in tutti i campi.

Inviato da BLN-L21 tramite App ufficiale di Tom\'s Hardware Italia Forum
Post unito automaticamente:

Altro dubbio: ma la calloc dovrebbe inizializzare a 0 i campi. Come mai non lo fa?
Ho riciclato tutta la tabella per allocare la memoria che era gia stata precedentemente allocata ma i vecchi valori rimangono.
C:
[CENTER]*
*
*[/CENTER]
table = realloc(table,newrows * sizeof(char **));
    table[2] = malloc(cols * sizeof(char*));
    table[3] = malloc(cols * sizeof(char*));

    for(i = 0; i < newrows; i++)
        table[i] = calloc(1,cols *sizeof(char*));

    for (i = 0; i < rows; i++)
        for(l=0;l< cols; l++)
        {
            if( (cols - 1) == l)
                printf("%s\t\n",table[i][l]);
            else
                printf("%s\t",table[i][l]);
        }
 
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Non ho capito che hai fatto... secondo me dovresti fare qualcosa di semplice e comprendere le basi, perchè stai solo continuando ad aggiungere cose senza prenderti i dovuti tempi.

Le 2 malloc che fai allocano della memoria, poi fai un nuovo ciclo e allochi altra memoria. Perchè? Se vuoi allocare memoria per le righe in più, stai sbagliando, in quanto accedi a righe già allocate sicuramente in precedenza.

Inoltre stai anche sbagliando la sintassi della calloc: il primo argomento è il numero di elementi, il secondo la dimensione di ogni singolo elemento. Non devi moltiplicare tu per ottenere i bytes totali, come fai con malloc (https://www.cplusplus.com/reference/cstdlib/calloc/).

Ho modificato un pò il tuo esempio:
C:
    int newrows = 2;
    //aumento il numero di righe
    table = realloc(table,(rows + newrows) * sizeof(char**));

    for(int i=rows; i < (newrows+rows); i++)
        table[i] = calloc( cols,sizeof(char*));
    
    table[2][0] = "01234567890123456789"; 
    table[2][4] = "01234567890123456789";     
    
    table[3][1] = "01234567890123456789"; 
    table[3][2] = "01234567890123456789"; 
    
    for (i = 0; i < rows+newrows; i++) 
    {
        for(l=0;l< cols; l++)
        {
            if( (cols - 1) == l)
                printf("%s\t\n",table[i][l]);
            else
                printf("%s\t",table[i][l]);
        }
    }
    
    printf("Hello world!\n");

Output:
Codice:
00      01      02      03      04
10      11      12      13      14
00      01      02      03      04
10      11      12      13      14
01234567890123456789    (null)  (null)  (null)  01234567890123456789
(null)  01234567890123456789    01234567890123456789    (null)  (null)
Hello world!


Ps. sarebbe inoltre meglio fare un check su cosa ti viene restituito da calloc/malloc/realloc, poichè non è detto che l'allocazione vada a buon fine.

PPS. anche se al termine del programma la memoria viene rilasciata, è buona norma utilizzare anche i free (specie se è un programma che rimane in esecuzione a lungo).
 

BigIssue

Utente Attivo
221
18
CPU
intel dual core n3050
Scheda Madre
asus x540s
RAM
4gb
GPU
intel HD
OS
Windows 10
Le 2 malloc che fai allocano della memoria, poi fai un nuovo ciclo e allochi altra memoria. Perchè? Se vuoi allocare memoria per le righe in più, stai sbagliando, in quanto accedi a righe già allocate sicuramente in precedenza.
Cio che volevo sapere. Scusa. sto sperimentando. Era per sapere come si comporta.
La calloc dovrebbe reinizializzare a 0 le variabili anche le stringhe e non lo fa. Ci guardo meglio.

ci metto anche i controlli NULL se alloca correttamente e free per liberare la memoria. grazie dell'aiuto @DispatchCode controcambio quando potrò. Buona giornata.
 
  • Mi piace
Reazioni: DispatchCode

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!