2015-07-31 2 views
-2

Я обнаружил, что проблема заключается в сегментации, и программа получает сигнал SIGSEGV. Программа намного сложнее, чем это, но это единственные моменты, на которые влияют эти массивы.Как присвоить значения двумерному динамическому массиву?

При попытке распечатать или присвоить значения Inputarray и Outputarray программа выйдет из строя, не показывая никаких ошибок.

Я создал программу, которая делает только это, и она работает отлично, поэтому, поскольку я понятия не имел, что вызывает эту проблему, я решил поставить весь код до этой точки.

ПРОГРАММА СБОРОВ НА ПЛОЩАДКЕ, В КОТОРЫХ Я ВКЛЮЧАЛ ИСКЛЮЧИТЕЛЬНЫЕ МАРКИ.

До этого момента он отлично работает. Когда я искал похожие случаи, все, что я нашел, это люди, которые используют разные функции для распределения своих массивов, которые я не понимаю, как это связано с моей проблемой. Самое странное, что я создал другую программу только с этим и, похоже, работает Спасибо за помощь !!

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

int main() 
{ 
    FILE*Results_ptr; 
    int* WaveguideConfig; 
    double* itta; 
    double** InputArray; 
    double** GateArray; 
    double** OutputArray; 
    double** ProbabilityArray; 
    double Final[21]; 
    double Error, ErrorIncrement; 
    double j,G,LO; 
    int* PhotonArray; 
    int i,m,z,o,k,a,c,v,I,M,A,B,C,D,E,F,H,J,K,N,NP,W,V,Z,L,GP,U,WG,ii,jj; 

    printf("Enter an integer for the number of entry points:"); 
    scanf("%d",&N); 
    printf("Enter an integer for the number of waveguides:"); 
    scanf("%d",&WG); 
    printf("Enter number of photons:"); 
    scanf("%d",&NP); 

    WaveguideConfig=(int*)malloc(N * sizeof(int*)); 
    itta=(double*)malloc(N * sizeof(double*)); 
    InputArray=(double**)malloc(NP * sizeof(double*)); 
    OutputArray=(double**)malloc(NP * sizeof(double*)); 

    for(W=0;W<NP;W++) 
    { 
     InputArray[W]=(double*)malloc(N * sizeof(double)); 
     OutputArray[W]=(double*)malloc(N * sizeof(double)); 
    } 
    GateArray=(double**)malloc(N * sizeof(double*)); 
    ProbabilityArray=(double**)malloc(N * sizeof(double*)); 

    for(Z=0;Z<N;Z++) 
    { 
     GateArray[Z]=(double*)malloc(N * sizeof(double)); 
     ProbabilityArray[Z]=(double*)malloc(N * sizeof(double)); 
    } 

    Results_ptr=fopen("Results.txt","w"); 
    printf("Enter configuration of the waveguides:"); 
    scanf("%d %d %d %d %d %d %d", &WaveguideConfig[0], &WaveguideConfig[1], &WaveguideConfig[2], &WaveguideConfig[3], &WaveguideConfig[4], &WaveguideConfig[5], &WaveguideConfig[6]); 
    printf("Enter the corresponding values of reflectivity:"); 
    scanf("%lf %lf %lf %lf %lf %lf %lf",&itta[0],&itta[1],&itta[2],&itta[3],&itta[4],&itta[5],&itta[6]); 
    PhotonArray=malloc(NP * sizeof(int)); 
    printf("Enter photon entry points:"); 
    scanf("%d %d", &PhotonArray[0], &PhotonArray[1]); 
    printf("Enter error in reflectivity:"); 
    scanf("%lf",&Error); 
    ErrorIncrement=Error/10; 

    for(H=0;H<10;H++) 
    { 
     for(GP=0;GP<NP;GP++) 
     { 
      InputArray[GP][PhotonArray[GP]]=1; 
     } 
     C=0; 
     E=0; 
     C=0; 
     G=0; 
     for(k=0;k<WG;k++) 
     { 
      for(m=0;m<N;m++) 
      { 
       for(z=0;z<N;z++) 
       { 
        if(z==m) 
        { 
         GateArray[m][z]=1; 
        } 
        else 
        { 
         GateArray[m][z]=0; 
        } 
       } 
      } 
      GateArray[WaveguideConfig[k]][WaveguideConfig[k]]=sqrt(itta[k]+H*ErrorIncrement); 
      GateArray[WaveguideConfig[k]][WaveguideConfig[k]+1]=sqrt(1-itta[k]+H*ErrorIncrement); 
      GateArray[WaveguideConfig[k]+1][WaveguideConfig[k]]=sqrt(1-itta[k]+H*ErrorIncrement); 
      GateArray[WaveguideConfig[k]+1][WaveguideConfig[k]+1]=-sqrt(itta[k]+H*ErrorIncrement); 
      for(I=0;I<N;I++) 
      { 
       for(M=0;M<N;M++) 
       { 
        if(M==(N-1)) 
        { 
         if(I==(N-1)) 
         { 
          printf("%lf\n\n", GateArray[I][M]); 
         } 
         else 
         { 
          printf("%lf\n", GateArray[I][M]); 
         } 
        } 
        else 
        { 
         printf("%lf\t", GateArray[I][M]); 
        } 
       } 
      } 
      for(L=0;L<NP;L++)//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
      { 
       for(i=0;i<N;i++) 
       { 
        for(o=0;o<N;o++) 
        { 
         OutputArray[L][i]+=GateArray[i][o]*InputArray[L][o]; 
         printf("%lf", OutputArray[L][i]); 
        } 
       } 
      }//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!` 
     } 
    } 
} 
+5

Первый шаг программирования - узнать, как отступать от кода. – haccks

+2

Первый шаг с динамическим распределением памяти - это не выдавать результат 'malloc' & friends в C. Это не C++! И: это не 2-мерные массивы, а 1D массивы указателей (до 1D массивов). – Olaf

+2

Запустите этот код через отладчик - один шаг, а затем вы увидите, где он «сбой». Также - разделить код на функции - так что это не так «волосатое», чтобы посмотреть. – Neil

ответ

0

Я не вижу ошибок в цикле. Все доступные массивы правильно распределены и имеют нужный размер.

Однако возвращаемое значение scanf никогда не проверяется и не считывание ожидаемого значения может привести к использованию унифицированной переменной (со случайным значением).

Использование:

printf("Enter an integer for the number of entry points:"); 
    if (scanf("%d",&N) != 1) {printf("Invalid input\n"); return(1);} 

Я не зсапЕ гуру, но часто видят использование ведущего пространства, чтобы пропустить любое пустое пространство еще в буфере:

printf("Enter an integer for the number of waveguides:"); 
    if (scanf(" %d",&WG)!=1) {printf("Invalid input\n"); return(1);} 

EDIT . . Также проверяется возвращаемое значение от malloc. Следовательно, используя униализованную переменную (потому что scanf не удалось) с неожиданно большим и случайным значением, выйдет malloc, потому что запрошено слишком много памяти. В результате я ожидаю, что во время вашей петлевой памяти, которая не принадлежит к программе, к ней обращается, что диспетчер памяти помечен как незаконный и прерывает программу.

0

Первый вопрос, который я вижу это:

printf("Enter an integer for the number of entry points:"); 
scanf("%d",&N); 
... 
WaveguideConfig=(int*)malloc(N * sizeof(int*)); 
itta=(double*)malloc(N * sizeof(double*)); 
... 
printf("Enter configuration of the waveguides:"); 
scanf("%d %d %d %d %d %d %d", &WaveguideConfig[0], &WaveguideConfig[1], &WaveguideConfig[2], &WaveguideConfig[3], &WaveguideConfig[4], &WaveguideConfig[5], &WaveguideConfig[6]); 
printf("Enter the corresponding values of reflectivity:"); 
scanf("%lf %lf %lf %lf %lf %lf %lf",&itta[0],&itta[1],&itta[2],&itta[3],&itta[4],&itta[5],&itta[6]); 

Вы специально чтения в 7 значений массива как для WaveguideConfig и itta, однако, если вы вводите значение N менее 7, вы не размещает достаточно память для этих массивов и запись за конец выделенной памяти.

Следующее это:

printf("Enter number of photons:"); 
scanf("%d",&NP); 
... 
PhotonArray=malloc(NP * sizeof(int)); 
printf("Enter photon entry points:"); 
scanf("%d %d", &PhotonArray[0], &PhotonArray[1]); 
printf("Enter error in reflectivity:"); 
.... 
for(H=0;H<10;H++) 
{ 
    for(GP=0;GP<NP;GP++) 
    { 
     InputArray[GP][PhotonArray[GP]]=1; 
     ... 

Если ввести в значении для NP больше, чем 2, только первые 2 пунктов в PhotonArray инициализируется. Таким образом, как только GP больше 1, PhotonArray[GP] не определено, и поэтому InputArray[GP][PhotonArray[GP]] может указывать на конец массива.

Существует еще больше, чем это. Запустите свой код через valgrind, и это скажет вам, когда вы переступаете границы вашей памяти.

+0

Я всегда использую номера, которые не перешагивают границы памяти, потому что это тест. Когда программа завершена, она будет считывать функцию fscanf из файла. Тем не менее, я хочу, чтобы это запускалось первым, до этого момента я стараюсь использовать правильные цифры. –

+0

Все равно, запустите свой код через valgrind. Это скажет вам, где вы переступаете границы вашей памяти. – dbush

Смежные вопросы