problem pod linuksem

0

witam,
mam problem z programem, kompiluje sie on pod windowsem, natomiast pod linuksem wyskakuje blad "naruszenie ochrony paimeci". W czym moze tkwic problem?

przesylam kod

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  
 int **tab;
 int **tabkol;
 int a=0, b=0, i, n;
 int wsp_test;
 int petl;
 char kon = '\0', lol;
 
 printf ("jaki chcesz rozmiar swiata?");
 scanf ("%d", &n);

tab=(int **)calloc((n+2),sizeof(int *)); 
for(i=0;i<(n+2);i++){
tab[i]=(int*)calloc((n+2),sizeof(int));
}

tabkol=(int **)calloc((n+2),sizeof(int *)); 
for(i=0;i<(n+2);i++){
tabkol[i]=(int*)calloc((n+2),sizeof(int));
}

for (a; a<(n+2); a++, b=0)
{
    for (b; b<(n+2); b++)
    {
       if (a==0 || b==0) *(*(tab+a)+b) = 0;
       if (a==(n+1) || b==(n+1)) *(*(tab+a)+b) = 0;
        }
    }
    
    a=0; b=0;
    
 for (a; a<(n+2); a++, b=0)
{
    for (b; b<(n+2); b++)
    {
       if (a==0 || b==0) *(*(tabkol+a)+b) = 0;
       if (a==(n+1) || b==(n+1)) *(*(tabkol+a)+b) = 0;
        }
    }   


a=1; b=1;

for (a; a<(n+1); a++, b=1)
{
    for (b; b<(n+1); b++)
    {
       scanf("%d", &*(*(tab+a)+b)) ;
       
       
        }
    }

system ("cls");

    a=1; b=1;

for (a; a<(n+1); a++, b=1)
{
    printf ("\n");
    for (b; b<(n+1); b++)
    {
       printf("%d  ", *(*(tab+a)+b)) ;
        }
    }
scanf ("%c", lol);    
while (kon!='k')
{   
printf ("\n\n");
    
    
    a=1; b=1;
    for (a; a<(n+1); a++, b=1)
{
    for (b; b<(n+1); b++)
    {
       if (*(*(tab+(a-1))+(b-1))) wsp_test++ ;
       if (*(*(tab+(a-1))+b)) wsp_test++ ;
       if (*(*(tab+(a-1))+(b+1))) wsp_test++ ;
       if (*(*(tab+a)+(b+1))) wsp_test++ ;
       if (*(*(tab+(a+1))+(b+1))) wsp_test++ ;
       if (*(*(tab+(a+1))+b)) wsp_test++ ;
       if (*(*(tab+(a+1))+(b-1))) wsp_test++ ;
       if (*(*(tab+a)+(b-1))) wsp_test++ ;
       
       if (wsp_test == 3) *(*(tabkol+a)+b) = 1;
       if (wsp_test == 2) *(*(tabkol+a)+b)=*(*(tab+a)+b);
       if (wsp_test!= 3 && wsp_test!=2) *(*(tabkol+a)+b)=0;
       
       wsp_test=0;
        }
    }
    
    a=1; b=1;
    
    kon = getchar();
    if (kon == 'z') {zapi(tab, n);}

for (a; a<(n+1); a++, b=1)
{
    printf ("\n");
    for (b; b<(n+1); b++)
    {
       printf("%d  ", *(*(tabkol+a)+b)) ;
        }
    }

a=1; b=1;

for (a; a<(n+1); a++, b=1)
{
    for (b; b<(n+1); b++)
    {
       *(*(tab+a)+b) = *(*(tabkol+a)+b);
        }
    }
 
}
}

zapi(int **tab, int n)
{
int a = 1, b=1;
FILE *filePtr;
char nazwa[200];
printf ("Podaj nazwe pliku wraz ze sciezka:\n");
scanf ("%s", &nazwa);

filePtr = fopen(nazwa, "w");
		                        
for (a; a<(n+1); a++, b=1)
{
    
    for (b; b<(n+1); b++)
    {
      fprintf(filePtr, "%d  ", *(*(tab+a)+b));   
        }
        fprintf (filePtr, "\n");
    }
    
fclose(filePtr);
printf ("Dane zostaly zapisane");
getchar();
system("cls");
          
} 

 

z gory dzieki za pomoc

0

Pisze tak na gorąco, bo niestety nie mam czasu teraz czytać tego kodu.
Naruszenie ochrony pamięci znaczy tyle, że któryś z Twoich wskaźników nie wskazuje tam gdzie powinien, czyli albo go niezainicjalizowałeś, albo masz w nim śmieci, albo wyszedł poza zakres. Bardziej bym obstawiał dwa pierwsze, bo zwykłe wyjście poza zakres nie powinno na Linuksie powodować błędu ochrony pamięci, bo Linux nie używa segmentacji.

To, że na Windzie działa, a na Linuksie nie to nic aż dziwnego. Wszytko zależy np. od tego jak kernell poukłada dane w pamięci, albo jaką wartość mają "śmieci" w niezainicjalizowanych zmiennych. Takie rzeczy się zmieniają w zależności od systemu, luba nawet od uruchomienia aplikacji. Czasami może być tak, że jedno uruchomienie programu nie da błędu, a inne już spowoduje błąd.

0

scanf ("%c", &lol);

0

No tego to nie przewidziałem... :P

0

no ale tego scanfa tam dalem tylko dlatego ze nie znalem biblioteki getch()-a pod linuxem, ale problem nie lezy w tym kawalku kodu (zmiennej lol w ogóle nie uzywam tam). Jakby ktos mogl rzucic okiem na kod i powiedziec mi co jest nie tak, to bylbym wdzieczny bo ja kurde tam dziur nie widze...

1 użytkowników online, w tym zalogowanych: 0, gości: 1