Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Morg4n
0 / 0 / 0
Регистрация: 25.04.2010
Сообщений: 5
#1

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

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

Как изменить код, чтобы массив объявлялся в 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2013, 08:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача Указателя На Двумерный Массив В Функцию (C++):

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

Передача указателя на массив структур в функцию - C++
Здрвствуйте! Не могу сообразить почему вылетает segmentation fault в функции, inputDate при количестве элементов в массиве &gt;2 Если есть...

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

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

Передача указателя на массив структур в функцию и далее - C++
Не могу получить доступ к члеман массива структур, есть доступ только к первому члену массива. struct ABC { double a= 0; ...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
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
anmartex
...
1705 / 1198 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
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
dstat
36 / 38 / 1
Регистрация: 01.06.2011
Сообщений: 238
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
lemegeton
2924 / 1353 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
Morg4n
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
lemegeton
2924 / 1353 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2013, 10:00
Привет! Вот еще темы с ответами:

Передача указателя в функцию - C++
Здраствуйте. Если не охота читать гору текста то этот абзац + последущий за ним код можете пропустить. Задали на лабе сделать некий...

Передача указателя в функцию - C++
Здравствуйте. Прошу помощи, сижу уже пару часов читаю мануалы, но так и не смог до конца понять, что мне делать. Есть вот такой код: ...

передача указателя на функцию - C++
Помогите исправить ошибку уже незнаю как быть В бивает ту ошибку error C2664: Generate: невозможно преобразовать параметр 2 из &quot;void&quot;...

Передача указателя в функцию - C++
Поиском не пользовался, возможно данный вопрос уже проскакивал. Проблема том, что VS2010 на отрез отказывается передавать указатель на...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.04.2013, 10:00
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru