Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Работа с матрицей через указатели


Автор: AlexeySheglov 6.5.2009, 20:48
Код

#include <stdlib.h>
#include <stdio.h>
#define A 120
#define B 300
int main() {
    int i,j;
    int * p;
    int * k;
    int b[40][6], ma[40][6];
    for (i=0;i<40;i++) {
        for (j=0;j<6;j++) {
            b[i][j]=0;
            ma[0][0]=0;;
        }
    }

    for (i=0;i<40;i++) {
        for (j=0;j<6;j++){
            scanf("%d", &b[i][j]);

        }
    }
    p=&b[0][0];
    k=&ma[0][0];
    for (i=0;i<40;i++) {
        for (j=0;j<6;j++) {
            if (i+1<40) {
                *(k+i*6+j) = *(k+i*6+j)+*(p+(i+1)*6+j);
            }
            if (i-1>=0) {
                *(k+i*6+j) = *(k+i*6+j)+*(p+(i-1)*6+j);
            }
            if (j+1<6) {
                *(k+i*6+j) = *(k+i*6+j)+*(p+(j+1)*6+j);
            }
            if (j-1>=0) {
                *(k+i*6+j) = *(k+i*6+j)+*(p+(j-1)*6+j);
            }
            if (i==0&&j==0) {
                printf("%d", ma[0][0]);
            }
            printf("%d ", *(k+i*6+j));
            if (j%6==0)  {
                printf("\n\n");
            }
        }
    }
return 0;
}



kto znaet, pomogite posh ispravit`
программа считывает из файла тхт(перенаправляю из СМD) массив(файл с массивом проверял все верно) и складывает соседние элементы массива через указатели.
(Нужно именно через них).
Выводит их построчно.
Однако данный код выводит вообще не сотни(так как файл забит только 3-х значными числами),
а выводит миллиарды

-858991170 -858990996 -858991064 -858990970 -858992341 -858991867 

-858990648 -858990206 -858990473 -858990638 -858991854 -858991647 

-и т.д.

Автор: Gluttton 6.5.2009, 22:27
1. Отформатируйте Ваш код, для этого используйте тэги "код":
user posted image

2. "Причешите" Ваши выходные данные (уменьшите шрифт или поместите их в тэги "без подсветки").

После этого Ваш вопрос будет распологать к внимательному изучению.

Автор: AlexeySheglov 6.5.2009, 22:34
все сделал)

Добавлено через 32 секунды
но код-то по-прежнему кривой)

Добавлено через 2 минуты и 57 секунд
я так понимаю, где-то происходит выход за границы массива.

Автор: math64 7.5.2009, 07:41
Код

            if (j+1<6) {
                *(k+i*6+j) = *(k+i*6+j)+*(p+(j+1)*6+j);
            }
            if (j-1>=0) {
                *(k+i*6+j) = *(k+i*6+j)+*(p+(j-1)*6+j);
            }

change to
Код

            if (j+1<6) {
                *(k+i*6+j) = *(k+i*6+j)+*(p+i*6+j+1);
            }
            if (j-1>=0) {
                *(k+i*6+j) = *(k+i*6+j)+*(p+i*6+j-1);
            }

Автор: zim22 7.5.2009, 07:48
скорей всего ошибка здесь:
Код

 *(k+i*6+j) = *(k+i*6+j)+*(p+(i+1)*6+j);

Автор: Earnest 7.5.2009, 07:48
Цитата(AlexeySheglov @  6.5.2009,  21:48 Найти цитируемый пост)
файл с массивом проверял все верно

Чтение проверял? Потом у тебя там какие-то вычисления; их правильность проверял? И уже когда убедишься, что все хорошо, проверяй вывод.

Автор: AlexeySheglov 7.5.2009, 13:35
Код

#include <stdlib.h>
#include <stdio.h>
#define A 120
#define B 300
int main() {
int i,j;
int * p;
int * k;
int b[40][6], ma[40][6];
p = &b[0][0];
k = &ma[0][0];
for (i=0;i<40;i++){
    for (j=0;j<6;j++){
        b[i][j]=0;
        ma[i][j]=0;
    }
}

for (i=0;i<40;i++){
    for (j=0;j<6;j++){
        scanf("%d", &b[i][j]);

    }
}
i=0;
j=0;
for (i=0;i<40;i++) {
    for (j=0;j<6;j++) {
        /* if (i+1<40) {
            *(k+i*6+j) = *(k+i*6+j)+*(p+(i+1)*6+j);
        }
        if (i-1>=0) {
            *(k+i*6+j) = *(k+i*6+j)+*(p+(i-1)*6+j);
        }
        if (j+1<6) {
            *(k+i*6+j) = *(k+i*6+j)+*(p+(j+1)*6+j);
        }
        if (j-1>=0) {
        *(k+i*6+j) = *(k+i*6+j)+*(p+(j-1)*6+j);
        }*/
        printf("%d", *(k+i*6+j));
        printf(" ");
        if (j%6==0) {
        printf("\n\n");
        }
    }
}
return 0;
}


ТАКОЙ КОД ВЫВОДИТ 0 МАТРИЦУ. HELP РАЗЪЯСНИТЕ scanf("%d", &b[i][j]); ВСЕ ЖЕ ПРАВИЛЬНО ВРОДЕ ПЕРЕНАПРАВЛЯЮ ВВОД ТАК "EXEшник" < "ТЕКСТОВЫЙ С МАССИВОМ".

Добавлено через 5 минут и 20 секунд
Т.Е ТОЧНО ВВОД НЕВЕРНЫЙ ФАЙЛ ЗАПОЛНЕН ВЕРНО ПОМОГИТЕ СО ВВОДОМ В КОДЕ!

Добавлено через 9 минут и 35 секунд
КСТАТИ, math64, ТЫ ПРАВ. ЭТО ЕЩЕ ОДНА ОШИБКА. СПАСИБО. НО ВСЕ ЖЕ СО ВВОДОМ ЕЩЕ ПРОБЛЕМНЕЙ.

Автор: AlexeySheglov 7.5.2009, 14:19
help

Автор: AlexeySheglov 7.5.2009, 15:24
Код

#include <stdlib.h>
#include <stdio.h>
#define A 120
#define B 300
int main() {
int i,j;
int * p;
int * k;
int b[40][6], ma[40][6];
p = &b[0][0];
k = &ma[0][0];
for (i=0;i<40;i++){
    for (j=0;j<6;j++){
        b[i][j]=0;
        ma[i][j]=0;
    }
}

for (i=0;i<40;i++){
    for (j=0;j<6;j++){
        scanf("%d", &b[i][j]);

    }
}
i=0;
j=0;
for (i=0;i<40;i++) {
    for (j=0;j<6;j++) {
        if (i+1<40) {
            *(k+i*6+j) = *(k+i*6+j)+*(p+(i+1)*6+j);
        }
        if (i-1>=0) {
             *(k+i*6+j) = *(k+i*6+j)+*(p+(i-1)*6+j);
        }
        if (j+1<6) {
             *(k+i*6+j) = *(k+i*6+j)+*(p+i*6+j+1);
        }
        if (j-1>=0) {
             *(k+i*6+j) = *(k+i*6+j)+*(p+i*6+j-1);
        }
        if (j%6==0) {
        printf("\n\n");
        }
        printf("%d ", *(p+i*6+j));
    }
}
return 0;
}

исправил ввод, но вычислений никаких не происходит, т.е. выводится содержимое вводимого файла.
Прошу помочь.


Добавлено через 6 минут и 54 секунды
исправил ввод, но вычислений никаких не происходит, т.е. выводится содержимое вводимого файла.
Прошу помочь.

Добавлено через 12 минут и 13 секунд
да, *р кто поможет.
сам нашел ашипку.
math64 большое спасибо. очень важно езамечание. сам бы долго искал.
тему можно закрыть.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)