Crash programma console

di il
5 risposte

Crash programma console

Quando eseguo questo programma funziona correttamente(almeno per quanto io sappia), ma alla seconda volta che vado su "case 1" o "case 2" durante la stessa sessione crasha con errore
(0x)C0000005 -> -1073741819
dopo l'istruzione
"printf("\n\n CIAO SONO UN BUG!!!\n\n");"
Questo non si verifica se vado più volte sugli altri "case".

Non ho idea di dove sia l'errore... aiuto!

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>
#include <tchar.h>

int displayMenu();
int openFile(char *pathName);
int cToM(int row, int col, int maxCol);
int aggiornaMatrice(int *matrice,int *righe,int *colonne,const char *fileName);

int main(int args,char **argv)
{
    int scelta;

    int *matrice1;
    int *matrice2;

    int righeMatrice1;
    int colonneMatrice1;
    int righeMatrice2;
    int colonneMatrice2;

    while(1){
        scelta=displayMenu();

printf("\n scelta: %d", scelta);
system("pause");

        switch(scelta){
            case 1:
                openFile(_tcsdup(TEXT("notepad.exe matrice1.txt")));
                aggiornaMatrice(matrice1,&righeMatrice1,&colonneMatrice1,"matrice1.txt");
                break;
            case 2:
                openFile(_tcsdup(TEXT("notepad.exe matrice2.txt")));
                aggiornaMatrice(matrice2,&righeMatrice2,&colonneMatrice2,"matrice2.txt");
                break;
            case 3:
                printf("\n\n prodotto: ");
                break;

            // ...

            default:
                printf("\n\n [ERROR] cmd not defined [/ERROR]\n\n");
                break;
        }

        system("pause");
        system("cls");
    }


}


int cToM(int row, int col, int maxCol)
{
    return (row*maxCol)+col;
}

int displayMenu()
{
    int scelta;

    printf("\n Cosa vuoi fare?\n");
    printf("\n\t1-Modifica matrice 1");
    printf("\n\t2-Modifica matrice 2");
    printf("\n");
    printf("\n\t3-Calcola prodotto");
    printf("\n\t4-Calcola derivata");

    scanf("%d", &scelta);

    return scelta;
}

int openFile(LPTSTR pathName){
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if( !CreateProcess( NULL,
        pathName,
        NULL,
        NULL,
        FALSE,
        0,
        NULL,
        NULL,
        &si,
        &pi )
    )
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );
        return -1;
    }

    WaitForSingleObject( pi.hProcess, INFINITE );

    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );


    return 0;
}

int DEBUG_stampaMatrice(int *matrice,int x,int y){

    for(int i=0;i<x;i++){
        for(int j=0;j<y;j++){
            printf("%d\t", matrice[cToM(i,j,y)]);
        }
        printf("\n");
    }

    return 0;
}

int aggiornaMatrice(int *matrice,int *righe,int *colonne,const char *fileName)
{
    FILE *f=fopen(fileName,"r");

    int indice=0;
    char c;

    fscanf(f,"%d\t%d\n*\n", righe,colonne);

    matrice=(int*)realloc(matrice,(*righe)*(*colonne));

    for(int i=0;i<(*righe);i++){
        for(int j=0;j<(*colonne);j++){
            fscanf(f,"%d", &matrice[cToM(i,j,*colonne)] );
            c=getc(f);

            if(c!='\t' and c!='\n'){
                printf("\n\n[ERROR] couldn't load vector [/ERROR]\n\n");
                return -1;
            }
        }
    }

    printf("\n\n Lettura da file completata!\n");

    printf("\n\nDEBUG stampo la matrice...\n");
    DEBUG_stampaMatrice(matrice,*righe,*colonne);

    printf("\n\n CIAO SONO UN BUG!!!\n\n");

    return 0;
}

5 Risposte

  • Re: Crash programma console

    If(c!='\t' and c!='\n'){

    and ??

    Non hai nessun errore durante la compilazione ??


    P.S. Lo switch non è un ciclo
    P.P.S. Non scrivere il titolo in maiuscolo ... significa urlare ...
  • Re: Crash programma console

    1-non ho errori
    2-usando code::blocks posso scrivere and/or/xor/not/xor_eq/and_eq ecc... e li trasforma nei corrispondenti connettivi logici
    3-anche scrivendo && l'errore persiste

    ps: "ciclo switch" nel senso che e' utilizzato in un ciclo indefinito
  • Re: Crash programma console

    Non so se in C:B tu possa fare una cosa del genere ma è estremamente "brutta" e ovviamente "non portabile" su tutti gli altri compilatori. Ti consiglio di non usarla.

    Non ho detto che i tuoi problemi fossero legati alla and ma volevo solo capire come compilavi con quell'errore.

    I problemi che hai sono legati

    - al passaggio del puntatore alla matrice dal main alla aggiornaMatrice (deve essere un doppio puntatore se vuoi che venga modificato)

    - alla realloc di un puntatore il cui valore precedente non è valido
  • Re: Crash programma console

    -per l' "and": si concordo, ma rimane un problema secondario. cmq basta mettere "&&"

    -per il secondo punto: intendi dire che nella realloc() uso un puntatore che non ho inizializzato?
    in questo caso potrei risolvere così?
    
    free(matrice);
    matrice=(int*)malloc((*righe)*(*colonne));
    
    -per il primo punto: mi rivedo con calma la teoria sui puntatori,ecc... e poi cerco di aggiustare il codice. Al massimo chiederò chiarimenti nel forum.

    A domani raga
  • Re: Crash programma console

    Ma in quel caso, la free opera su un puntatore mai utilizzato.

    Nel main utilizza un puntatore impostato a NULL

    int *matrice1 = NULL;

    e passalo per puntatore alla funzione

    int aggiornaMatrice(int **matrice, ...)

    così

    aggiornaMatrice( &matrice1, ...

    A quel punto, nella aggiornaMatrice potrai usare la realloc in questo modo

    *matrice = (int*)realloc(*matrice, (*righe)*(*colonne));
Devi accedere o registrarti per scrivere nel forum
5 risposte