2016-04-07 2 views
-1

[EDIT] Основная проблема заключалась в том, что пригодность моей эволюции возвращала одно и то же значение каждый раз после изменения некоторого значения int в float. Главное, что я перезапустил компьютер, и это удивительно сработало снова.Некоторые данные исчезают из-за указателя при вызове функции

Я вызываю функцию из своей основной, когда я отлаживаю код, переменные содержат данные, но в заголовке функции, когда я отлаживаю, мои данные теряются, а ссылка на память одинакова (я компиляции с Visual Studio 2013), это происходит только в некоторых переменных (вы можете проверить, какие из них в фотографии ниже)

int main(){ 
    float resultados[NUMCROMOSOMAS][CANTIDADMEDICIONES]; 
    int in[CANTIDADMEDICIONES][NUMVAR]; 
    char gramaticas[NUMCROMOSOMAS][LONGITUDCADENA]; 
    int mejorValorIndividuo[100]; 
    char variableNames[NUMVAR + 1]; 
    float fitness[NUMCROMOSOMAS]; 
    char mejorindividuo[LONGITUDCADENA]; 
    float medicionesObtenidas[NUMCROMOSOMAS][CANTIDADMEDICIONES]; 
    int i,j; 

(инициализация, некоторые из них являются соответствующими)

for (i = 0; i < NUMCROMOSOMAS; i++) 
     fitness[i] = 0.0; 


    for (i = 0; i < CANTIDADMEDICIONES; i++) 
     in[i][0] = i; 

Да, это была двумерная матрица, использующая один столбец

А вот основной цикл моей программы

int curr = MAXINT; 
    i = 0; 
    while (isNotGoodEnough(curr)){ 
     i++; 
     curr = generacion(poblacion, results, input, collectedData, gramaticas, mejorindividuo, variableNames, fitness); 
    } 
    return poblacion[0][0]; 
} 

Заголовок моей функции заключается в следующем:

int generacion(int poblacion[NUMCROMOSOMAS][SIZECROMOSOMAS], 
       float resultados[NUMCROMOSOMAS][CANTIDADMEDICIONES], 
       int in[CANTIDADMEDICIONES][NUMVAR], 
       float valoresEsperados[NUMCROMOSOMAS][CANTIDADMEDICIONES], 
       char gramaticas[NUMCROMOSOMAS][LONGITUDCADENA], 
       char * mejorIndividuo, 
       char variableNames[NUMVAR], 
       float fitness[NUMCROMOSOMAS]){ 

Вот компилятор до вызывающего before the calling Вот правильный компилятор после звонка enter image description here

Что я делаю неправильно?

+0

Что именно вас озадачивает? –

+0

Программа представляет собой грамматическую эволюцию, но удивительно, что моя пригодность всегда одинакова, что произошло, когда я изменил некоторые переменные, я изменил int precission.It стал двойным. – Kaostias

+0

Я глубоко смущен, потому что после перезагрузки машины моя программа снова функционирует. Любые намеки? – Kaostias

ответ

4

Если у вас есть аргумент заявление как

int in[CANTIDADMEDICIONES][NUMVAR] 

, что это на самом деле не то, что использует компилятор, что он переводит его в

int (*in)[NUMVAR] 

Другими словами in является указатель и не массив.

То, что вы видите в отладчике в функции, является указателем , но поскольку размер данных, на которые указывает указатель, неизвестен, отладчик не может отображать данные напрямую. Если вы явно, в отладчике, когда в функции, проверьте in[0], вы увидите, что данные верны.

Другими словами, это не проблема с кодом, так выглядит отладчик (или, скорее, не отображает).

+0

Возможно, удивительно (не только для OP), что отладчик, как представляется, просто отображает элементы других аргументов 2D-массива. В чем разница между 'poblacion' и' in'? –

+0

А, более пристальный взгляд раскрывает проблему. Как вы говорите правильно, формальный параметр 'in' of' generacion() 'является указателем на массив. Отладчик по умолчанию отображает данные за указателем. Он знает, как отображать массив: он отображает все элементы, каждый в фигурных скобках.Он делает это для 'poblacion', который является указателем на массив из 128 ints. Он делает это и для 'in', если мы внимательно посмотрим; 'in' просто является указателем на массив из 1 int (' NUMVAR' равен 1), который имеет значение 0. Отладчик не отображает содержимое 'in + 1' или' poblacion + 1' (потому что это может не быть доступной памятью). –

+0

@ PeterA.Schneider Итак, если размер был больше, это может быть шоу? – Kaostias

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

  • Нет связанных вопросов^_^