Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 25.04.2010
Сообщений: 5
1

Передача Указателя На Двумерный Массив В Функцию

10.04.2013, 08:21. Показов 1458. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как изменить код, чтобы массив объявлялся в main() и передавался в input_strings().
Код:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define MAXLENGTH 129
#define MAXSIZE 20
 
char arr_str[MAXSIZE][MAXLENGTH];
 
int input_strings(){
    int i,n;
    for(i = 0;i<MAXSIZE;i++){
        printf ("line %-2d: ", i);
        gets(arr_str[i]);
        if(!arr_str[i]) break; // выход по пустой строке
        n++; //кол-во строк
    }  
    return n;
}
 
int main(void) {
 
    int n;
    n = input_strings();
}
Голову уже сломал =\
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2013, 08:21
Ответы с готовыми решениями:

Передача указателя на двумерный массив в функцию
Здравствуйте. Сильно не ругайтесь, в c++ недавно. Потихоньку подошел к указателям. Могу передать...

Передача в функцию указателя на динамический массив
Добрый день. Не могу понять одну вещь. Вот такой вот код работает. Создается массив из 10 элементов...

Передача указателя на массив структур в функцию
Здрвствуйте! Не могу сообразить почему вылетает segmentation fault в функции, inputDate при...

Передача в функцию указателя на указатель на одномерный массив
Как изменить следующий код, чтобы в функции addValue в качестве первого входного параметра...

6
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
10.04.2013, 08:55 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int input_strings(char** arr_str)
{
    int i,n;
    for(i = 0;i<MAXSIZE;i++)
    {
        printf ("line %-2d: ", i);
        if(gets(arr_str[i]))break; // выход по пустой строке
        n++; //кол-во строк
    }  
    return n;
}
 
int main(void) 
{
   char** ps=new char*[MAXSIZE];
    for(int i = 0;i<MAXSIZE;i++)
             ps[i]=new char[MAXLENGTH];
 
    int n;
    n = input_strings(ps);
    ....
    for(int i = 0;i<MAXSIZE;i++)
        delete[] ps[i];
    delete[] ps;
}
1
...
1906 / 1326 / 965
Регистрация: 12.02.2013
Сообщений: 2,172
10.04.2013, 08:56 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cstdio>
 
#define MAXLENGTH 129
#define MAXSIZE 20
 
int input_strings(char arr_str[MAXSIZE][MAXLENGTH]){
    int i,n = 0;
    for(i = 0;i<MAXSIZE;i++){
        printf ("line %-2d: ", i);
        gets(arr_str[i]);
        if(!arr_str[i]) break; // выход по пустой строке
        n++; //кол-во строк
    }
    return n;
}
 
int main(void) {
    char arr_str[MAXSIZE][MAXLENGTH];
    int n = input_strings(arr_str);
 
    return 0;
}
1
36 / 38 / 7
Регистрация: 01.06.2011
Сообщений: 237
10.04.2013, 09:02 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#define MAXLENGTH 129
#define MAXSIZE 20
 
 
 
int input_strings(char arr_str[][MAXLENGTH]){
    int i=0,n=0;
    for(i = 0;i<MAXSIZE;i++){
        printf ("line %-2d: ", i);
        gets(arr_str[i]);
        if(!arr_str[i]) break; // выход по пустой строке
        n++; //кол-во строк
    }  
    return n;
}
 
int main(void) {
 char arr_str[MAXSIZE][MAXLENGTH];
    int n=0;
    n = input_strings(arr_str);
}
1
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
10.04.2013, 09:08 5
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
int inputStrings(char **arrayOfStrings, int maxHeight, int maxWidth) {
  int i;
  for (i = 0; i < maxHeight; ++i) {
    printf("line %-2d: ", i);
    // Резервируется 2 символа -- 1 под перенос строки, 1 под '\0'
    fgets(arrayOfStrings[i], maxWidth - 2, stdin);
    if (!arrayOfStrings[i] || arrayOfStrings[i][0] == '\n') {
      break;
    }
    // удаление переноса строки
    arrayOfStrings[i][strlen(arrayOfStrings[i]) - 1] = '\0';
  }
  return i;
}
 
char **createArrayOfStrings(int maxHeight, int maxWidth) {
  char **arrayOfStrings = (char**)malloc(sizeof(char*) * maxHeight);
  int i;
  for (i = 0; i < maxHeight; ++i) {
    arrayOfStrings[i] = (char*)malloc(sizeof(char) * maxWidth);
  }
  return arrayOfStrings;
}
 
void freeArrayOfStrings(char **arrayOfStrings, int maxHeight,
  int maxWidth) {
  int i;
  for (i = 0; i < maxHeight; ++i) {
    free(arrayOfStrings[i]);
  }
  free(arrayOfStrings);
}
 
int main(int argc, char *argv[]) {
  int maxHeight = 20;
  int maxLength = 129;
  
  char **arrayOfStrings = createArrayOfStrings(maxHeight, maxLength);
  
  int actualNumberOfLines = inputStrings(arrayOfStrings, maxHeight,
    maxLength);
  printf("Number of lines: %d\n", actualNumberOfLines);
  
  int i;
  for(i = 0; i < actualNumberOfLines; ++i) {
    printf("Line #%-2d: '%s'.\n", i, arrayOfStrings[i]);
  }
 
  freeArrayOfStrings(arrayOfStrings, maxHeight, maxLength);
  return 0;
};
1
0 / 0 / 0
Регистрация: 25.04.2010
Сообщений: 5
10.04.2013, 09:28  [ТС] 6
dstat, anmartex, wow, 4 мать его часа гугления, чтобы все оказалось так просто - я полный кретин, спасибо!

lemegeton, если я правильно понял, Ваш вариант работает через массив указателей, такой подход, в моем случае вызовет слишком много лишних вопросов про то, как это конкретно работает, а я, к сожалению, не сильно пока разбираюсь в этом, но спасибо!
Помогите слегка разобраться:
C
1
2
3
 char **arrayOfStrings = (char**)malloc(sizeof(char*) * maxHeight); // я слегка сконфужен в этой строчке
 
arrayOfStrings[i] = (char*)malloc(sizeof(char) * maxWidth); // и в этой тоже =\
zss, аналогично и Ваш вариант, спасибо!
Правильно ли я понимаю:
C
1
2
3
char** ps=new char*[MAXSIZE]; // создаем "указатель массив" на массив указателей 
    for(int i = 0;i<MAXSIZE;i++)
             ps[i]=new char[MAXLENGTH]; // забиваем массив словами
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
10.04.2013, 10:00 7
Цитата Сообщение от Morg4n Посмотреть сообщение
char **arrayOfStrings = (char**)malloc(sizeof(char*) * maxHeight);
Тут происходит три вещи.
1. Объявляется переменная arrayOfStrings -- "указатель на указатель на символ", можно считать его массивом указателей на символ или массивом строк.
2. Выделяется память под maxHeight указателей на строки. То есть, под maxHeight строк.
3. Присваивается указателю из п.1 адрес на свежевыделенную память.
Грубо говоря, выделяется память под сам массив строк.

Цитата Сообщение от Morg4n Посмотреть сообщение
arrayOfStrings[i] = (char*)malloc(sizeof(char) * maxWidth);
Тут каждому указателю на символ внутри массива указателей (читайте предыдущий пункт) выделяется память размером maxWidth байт. Грубо говоря, выделяется память под конкретные строки.
1
10.04.2013, 10:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2013, 10:00
Помогаю со студенческими работами здесь

Передача указателя на массив структур в функцию и далее
Не могу получить доступ к члеман массива структур, есть доступ только к первому члену массива. ...

Передача указателя на массив тип complex в функцию
Всем дорого времени суток! Возникла проблема. Подскажите, пожалуйста. Как &quot;правильно&quot; сделать:...

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

Передача указателя на шаблонную функцию в другую функцию
Пишу тест для нескольких улучшений квиксорта с измерением времени. Функция benchmark принимает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru