RISOLTO [C] Sommare le colonne di un array 2D

Stato
Discussione chiusa ad ulteriori risposte.

Luc1

Nuovo Utente
108
15
CPU
Ryzen 5 7600x
Dissipatore
Noctua
Scheda Madre
Asrock B640m riptide
HDD
troppi samsung per quanto voglia ammettere
RAM
Corsair vengeance kit 32 GB ddr5
GPU
Asus 4060 TI
Monitor
Samsung odyssey TN
PSU
Un corsair decente
Case
NZXT H7 Flow
Periferiche
Corsair harpoon RGB, Corsair K55 RGB
Net
TIM Fttc 100/20 Mbit
OS
Windows 11
Chiedo un aiuto ai voi , sto cercando di risolvere un esercizio banale ma che inaspettatamente mi sta creando molte rogne, portandomi fino a postare aiuto qui :
Si tratta di prendere un array 2D , sommarne tutti gli elementi di una colonna , in seguito confrontare il risultato con le somme precedenti per trovare il massimo valore di somma.Questo è quello che ho partorito fin ora, ma all'atto di compilare il programma va in crash con errore 255(0xFF).
Codice:
#include <stdio.h>
#include <stdlib.h>
void maxc(int [][100],int ,int);
int main()
{
    int s[2][2]={{1,2},{2,3}};
    int i,j;
    for(i=0;i<2;i++)
        for(j=0;j<2;j++)
            printf("(%d,%d)= %d\n",i,j,s[i][j]);
    maxc(s,2,2);
    return 0;
}
void maxc(int a[][100],int c,int r)
{
    int i,j;
    int s,max;
    s=0;
    max=0;
    for(i=0;i<r;i++)
        for(j=0;j<c;j++)
        {
            s+=a[i][j];
            if(max<s)
                max=s;
            s=0;
        }
    printf("\n%d",max);
}

Qui non riesco a capire proprio dove sto sbagliando, eppure non dovrebbe importare se passo un vettore di 2*2 se ne avevo allocato spazio per 100*100.
Codice:
||=== Build: Debug in Traccia 4 (compiler: GNU GCC Compiler) ===|C:\Users\io\Desktop\Luca\uni inf\Prog1\Esercizio code blocks\impornta\Traccia 4\main.c||In function 'main':|
C:\Users\io\Desktop\Luca\uni inf\Prog1\Esercizio code blocks\impornta\Traccia 4\main.c|11|warning: passing argument 1 of 'maxc' from incompatible pointer type [enabled by default]|
C:\Users\io\Desktop\Luca\uni inf\Prog1\Esercizio code blocks\impornta\Traccia 4\main.c|3|note: expected 'int (*)[100]' but argument is of type 'int (*)[2]'|
||=== Build finished: 0 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
 

TheJudge

Utente Attivo
335
84
CPU
i5-8600k
Dissipatore
Cooler Master TX3 EVO
Scheda Madre
MSI Z370 SLI PLUS
HDD
SAMSUNG 840 Pro 250GB + SSD Sandisk 250GB
RAM
Hiperx 2x8GB DDR4 @2666Hz
GPU
Asus Strix 1070TI
Monitor
1 Asus 24" fullHD + BENQ 27" fullHD
PSU
EVGA SuperNova 850W 80+ gold
Case
NZXT S340
OS
Windows 10 Pro
hai provato a dichiarare la matrice da 2 al posto che da 100 nella dichiarazione della funzione?
 

Roberto_Trevigiani

Nuovo Utente
68
17
Qui non riesco a capire proprio dove sto sbagliando, eppure non dovrebbe importare se passo un vettore di 2*2 se ne avevo allocato spazio per 100*100.
]

No, è proprio quello il problema. Nella chiamata passi una cosa che non coincide con il prototipo è l'intestazione. Prova a modificare in modo da rendere coerente la chiamata è l'intestazione.
 

crsn

Utente Attivo
27
8
Case
nessuna, sono in affitto.
Più precisamente potresti provare a vedere l'array di array che hai creato come puntatore a puntatori, fammi pure sapere se ti funziona:

Codice:
void maxc(int** matrix,int columns,int rows)
{
    int max;


    for(int r=0; r < rows; ++r)
    {
        for(int c =0; c < columns; ++c)
        {
            int s = array[r][c];
            max = (max < s) ? s : max;
        }
    }
    printf("\n%d",max);
}
 
  • Mi piace
Reazioni: TheJudge

Luc1

Nuovo Utente
108
15
CPU
Ryzen 5 7600x
Dissipatore
Noctua
Scheda Madre
Asrock B640m riptide
HDD
troppi samsung per quanto voglia ammettere
RAM
Corsair vengeance kit 32 GB ddr5
GPU
Asus 4060 TI
Monitor
Samsung odyssey TN
PSU
Un corsair decente
Case
NZXT H7 Flow
Periferiche
Corsair harpoon RGB, Corsair K55 RGB
Net
TIM Fttc 100/20 Mbit
OS
Windows 11
Più precisamente potresti provare a vedere l'array di array che hai creato come puntatore a puntatori, fammi pure sapere se ti funziona:

Codice:
void maxc(int** matrix,int columns,int rows)
{
    int max;


    for(int r=0; r < rows; ++r)
    {
        for(int c =0; c < columns; ++c)
        {
            int s = array[r][c];
            max = (max < s) ? s : max;
        }
    }
    printf("\n%d",max);
}

Il tuo è un codice molto compatto , e sicuramente funzionante, purtroppo non ci è concesso l'uso del "?" nei nostri codici(dobbiamo attenerci a quello che ci hanno fornito i professori,almeno così si è inteso) oltre al fatto che essendo un ignorante ancora in C non so neanche quella chiamata che effetti da.

In ogni caso vi ringrazio per le risposte e gli aiuti, sono comunque riuscito a farlo funzionare, ecco qui di seguito il codice che ho usato(molto basilare) il tutto sta nel fornire l'array al programma non come valore ma come indirizzo nella notazione a puntatore, e poi scambiare nel ciclo FOR la posizione di i+j quando si scrive il vettore.
Codice:
#include <stdlib.h>#include <stdio.h>
double maxc(double *,int,int);
int main()
{
    double d[4][2]={{1.0,2.0},{3.0,4.0},{5.0,6.0},{7.0,8.0}};
    double m;
    m=maxc(&d[0][0],2,4);
    printf("%f\n",m);
    return 0;
}
double maxc(double *a,int c,int r)
{
    int i,j;
    double som=0.0,max=0.0;
    for(i=0;i<c;i++)
        {
            for(j=0;j<r;j++)
                som+=*(a+c*j+i);
        if(som>max)
            max=som;
        som=0;
        }
    return max;
}

Spero possa essere utile a qualcuno sprovveduto come me per il futuro.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
puoi riscrivere l'istruzione condizionale (quella col punto interrogativo)
Codice:
max = (max < s) ? s : max;
con un if
Codice:
if(max < s) max = s;
 
  • Mi piace
Reazioni: crsn e Luc1
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!