LinuxForum.Fans
Тема

Си. двумерный глобальный динамический массив (GCC 4.4.5)

Автор: webber 34 сообщений 8831 просмотров
#315889

Помогите!!! Си двумерный динамический массив глобальный (GCC 4.4.5)

text
#include <stdio.h>
#include <pthread.h>

int mart_size = 4; int A[4][4]; int B[4][4]; int C[4][4];

void* GenMatr(void* mart_size) { нужно здесь сделать чтоб массив становился размером что укажет пользователь с клавы for(int i; i<= mart_size; i++) { for(int j; j<= mart_size; j++) { A[i][j]; B[i][j]; } } }

#315911

Вне функции задаёшь массив без размера.
int *A=NULL;
Внутри функции задаёшь размер массива:
cin>>A_size;
A = new int[A_size];
Соответственно переменную A_size должен ввести пользователь.

#315912
Vascom написал:
Вне функции задаёшь массив без размера.
int *A=NULL;
Внутри функции задаёшь размер массива:
cin>>A_size;
A = new int[A_size];
Соответственно переменную A_size должен ввести пользователь.

Вы C и C++ не путайте.

#315913
webber написал:
Помогите!!! Си двумерный динамический массив глобальный (GCC 4.4.5)
text
#include <stdio.h>
#include <pthread.h>

int mart_size = 4; int A[4][4]; int B[4][4]; int C[4][4];

void* GenMatr(void* mart_size) { нужно здесь сделать чтоб массив становился размером что укажет пользователь с клавы for(int i; i<= mart_size; i++) { for(int j; j<= mart_size; j++) { A[i][j]; B[i][j]; } } }

man malloc
Да, и void* GenMatr(void* mart_size) это 2 ошибки сразу.

#315914
Alexey_1 написал:

Вы C и C++ не путайте.

Возможно. А это так важно?

#315943

попробуйте

text

#include <stdlib.h>

int **a;

int main () { a = (int **) malloc (16*sizeof(int*)); for (int i=0; i < 16; i++) a[i] = (int *)malloc (8*sizeof(int)); }

создается массив a[16][8]

#316145
marikk написал:
попробуйте
text

#include <stdlib.h>

int **a;

int main () { a = (int **) malloc (16*sizeof(int*)); for (int i=0; i < 16; i++) a[i] = (int *)malloc (8*sizeof(int)); }

создается массив a[16][8]

Вообще то нет.
a[16][8] - это malloc(16*8*sizeof(int)). То есть любой многомерный массив a[x][y]...[z] это malloc(x*y...*z).

#316146
Vascom написал:
[quote=Alexey_1]
Вы C и C++ не путайте.

Возможно. А это так важно?[/quote]
Думаю да.

#316266
sleeping.daemon написал:
Вообще то нет.
a[16][8] - это malloc(16*8*sizeof(int)). То есть любой многомерный массив a[x][y]...[z] это malloc(x*y...*z).

Совершенно неправильно. Это грубейшая ошибка при распределении памяти. malloc(16*8*sizeof(int)) отведет память для одномерного массива в 128 целых. Двумерный массив это массив указателей на массивы этих самых целых. Вначале надо распределить память под массив указателей, потом самим указателям из этого массива прималлочить соответствующую память.
То есть правильно надо писать так:

text
typedef INT *int;
INT *array;
array=(INT *)malloc(N*sizeof(INT))
for (int i=0; i<N; i++) array[i]=(INT)malloc(M*sizeof(int));

Тогда мы создадим корректно двумерный массив целых значений размерностью NxM, которые пользователь может задать с клавиатуры.

#316288

Все спасибо что откликнулись помогите найти где можно купить книгу на русском желательно с доставкой по России ну или самый крайний случай PDF RUS
Оригинальное название The C Programming Language Ritchie & Kernighan


ozon.ru не предлогать!
Заранее спасибо!!

#316305

Она есть на rutracker.org, но не в pdf.
Сам я её не читал.

Пётр.

#316343
webber написал:
Все спасибо что откликнулись помогите найти где можно купить книгу на русском желательно с доставкой по России ну или самый крайний случай PDF RUS
Оригинальное название The C Programming Language Ritchie & Kernighan

Это - первоисточник. От "отцов-основателей". К сожалению, написано весьма и весьма сухим языком. Читать эту без предварительной подготовки книгу тяжело. А с подготовкой - скучно. Примерно так же как и читать Страуструпа по С++.
А вот что порекомендую для освоения языка (чистого С) - так вот эту книжку http://storage.library.opu.ua/online/books/c/index.htm
Лучше найти в бумажном оригинале (с картинками). Я прочитал её в свое время за пару дней и мне этого хватило, чтобы понять концепцию языка и приемы его использования.

#316346
webber написал:
Помогите!!! Си двумерный динамический массив глобальный (GCC 4.4.5)

Кстати, подобные статические массивы лучше объявлять таким образом (меньше потенциальных ошибок).

text
#include <stdio.h>
#include <pthread.h>

#define mart_size 4

int A[mart_size][mart_size]; int B[mart_size][mart_size]; int C[mart_size][mart_size];

void* GenMatr(void* mart_size) { нужно здесь сделать чтоб массив становился размером что укажет пользователь с клавы for(int i=0; i< mart_size; i++) { for(int j=0; j< mart_size; j++) { A[i][j]; B[i][j]; } } }

Тогда изменив только один define в исходном тексте мы изменим размеры всех массивов (и обработчики этих массивов) по всему тексту программы. При этом мы избавляемся от риска каким либо образом в ходе выполнения программы повредить переменную "mart_size", поскольку это уже будет не переменная, а жестко прошитая в коде константа.

Ну и заодно - обращаю внимание на то, что я исправил еще 4(sic!) ошибки в коде программы. Попробуй найти это исправление и понять, почему это есть ошибки. Причем, ошибки грубые, то есть могущие поразить вообще все данные программы. Или сам код. Это - домашнее задание.

#316425

Cruiser78, Ну так это вить мой код! Не я немного знаю программирование поэтому мне по содержанию в ozone.ru Показалась эта книга содержательной

#316506
webber написал:
Cruiser78, Ну так это вить мой код! Не я немного знаю программирование поэтому мне по содержанию в ozone.ru Показалась эта книга содержательной

Нет. Это Ваш код, но исправленный. Код, в который добавлены некоторые аспекты надежности и убраны 4 грубые ошибки. Смотрите его внимательно. И постарайтесь самостоятельно определить, почему я отнес Ваши ошибки к категории грубых. Пока же у меня складывается ощущение, что Вы именно _немного_ (очень немного) знаете программирование на С. Без обид, все такими были. И потому я дал книжку, которую очень хорошо читать для начального освоения языка С. Если её освоить (она написана очень хорошим языком), то Керниган&Риччи ничего нового уже не дадут. Прату-Мартина можно читать, Керинигана - изучать. Разница в стиле изложения существенна.

#316529

Cruiser78, А ну я про #define не знал тота у меня размер массива не указывался переменной

#316575
webber написал:
Cruiser78, А ну я про #define не знал тота у меня размер массива не указывался переменной

Переменной указать размер статического массива Вы не сможете. И вообще, я не про #define. Я про него рассказал всё. Я в Вашем тексте нашел и исправил кроме этого 4 грубых ошибки. И просил Вас разобраться с ними самостоятельно. Вы же это делать упорно не хотите. А если Вы не поймете их суть на учебном примере, не поймете где именно напартачили, то вместо работоспособных программ будете получать глюкало страшное.

#317082
Cruiser78 написал:
[quote=sleeping.daemon]Вообще то нет.
a[16][8] - это malloc(16*8*sizeof(int)). То есть любой многомерный массив a[x][y]...[z] это malloc(x*y...*z).

Совершенно неправильно. Это грубейшая ошибка при распределении памяти. malloc(16*8*sizeof(int)) отведет память для одномерного массива в 128 целых. Двумерный массив это массив указателей на массивы этих самых целых. Вначале надо распределить память под массив указателей, потом самим указателям из этого массива прималлочить соответствующую память.
То есть правильно надо писать так:

text
typedef INT *int;
INT *array;
array=(INT *)malloc(N*sizeof(INT))
for (int i=0; i<N; i++) array[i]=(INT)malloc(M*sizeof(int));

Тогда мы создадим корректно двумерный массив целых значений размерностью NxM, которые пользователь может задать с клавиатуры.[/quote]
Посмотрите под отладчиком, c выводом значения массива a, вот этот пример:

text
void main(void)
{
    int a[2][3],i;
    int *pa;
    pa=a;
    for (i=0; i<6; i++){ *(pa+i)=0; };
    *(pa+5)=5;
    a[1][1]=11;
    *(pa+4)=4;
}
#317160
Alexey_1 написал:
Посмотрите под отладчиком, c выводом значения массива a, вот этот пример:

Не упорствуйте. Я вижу только, что Вы совершенно не понимаете сути организации массивов на Сях, вопросов типизации переменных и вопросы распределения памяти при объявлении переменных там.
Смотреть в отладчике мне Ваш пример незачем. Я и без него знаю, что я там увижу.
А увижу я там ошибку компилятора. Вам подсказать какую именно и в какой строке? Так что до отладчика и дело не дойдет.

Вам я предлагаю решить следующую задачу. Опять же по массивам.
Вопрос: Массивы а[3][4] и b[4][3] и c[12] (выделенные по Вашему правилу malloc(12*sizeof(int)))- тождественны? А именно - на что именно указывают указатели a[1], b[1] и c[1]? А а[3] и b[3]? А на какую ячейку будет казывать указатели a[1][5] и b[1][5]? Что будет происходить, если введем новый указатель int **p и сделаем так:
p=a;
p+=2; - куда показываем?
++p; - куда показываем?
p=b;
p+=2; куда показываем?
++p; Куда показываем?
А если мы сделаем так:
int **p=(int **)malloc(12,sizeof(int)) - куда будет показывать p[1][1]?

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

#317174
text

    int a[2][3];
    int *pa;
    pa=a;
text

int а[3][4];
int **p;
p=a;

Разве такое можно откомпилировать ?

Войдите или зарегистрируйтесь, чтобы ответить.