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

Ошибка при передаче двумерного массива в функцию - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Преобразовать каждое слово в строке, заменив в нем все последующие вхождения его первой буквы на символ «.» (точка). http://www.cyberforum.ru/cpp-beginners/thread1123090.html
Дана строка, состоящая из русских слов, набранных заглавными буквами и разделенных пробелами (одним или несколькими). Преобразовать каждое слово в строке, заменив в нем все последующие вхождения его первой буквы на символ «.» (точка). Например, слово «МИНИМУМ» надо преобразовать в «МИНИ.У.». Количество пробелов между словами не изменять. На языке си или с ++
C++ Неверная кодировка при записи в файл как сделать так чтобы программа смогла записывать русский и украинский язык у меня записывает только цифры ангалийську язык #include <stdio.h> #include <iostream> #include <conio.h> using namespace std; int main() { FILE *k; char Name = "C:\\Users\\FX-8350\\Desktop\\text.txt"; http://www.cyberforum.ru/cpp-beginners/thread1123084.html
Создание ДЕК (как стэк только о двух концах) без <deque> C++
здравствуйте! написал класс Deque, создал методы push_back(), push_front(), pop_back(), pop_front()... Все работает нормально, кроме push_front()... реализую так void Deque :: push_front( int data, int number ) { deque = data; head++;
Для нахождения интервала унимодальности использовать алгоритм Свенна C++
для нахождения интервала унимодальности использовать алгоритм Свенна f(x,y)=((y^3-x^2)^2)+100((1-x^2))
C++ Найти разницу между количеством положительных и отрицательных элементов http://www.cyberforum.ru/cpp-beginners/thread1123066.html
Помогите решить пожалуйста, на языке Си 15. Дан массив размера N. Найти разницу между количеством положительных и отрицательных элементов. Добавлено через 7 минут мне бы сам процесс решение
C++ Будет ли работать данная схема Мне интересно будет узнать возможна ли такая схема: Запуск программы => Чтение из памяти процесса => Передача извлечённых данных на сервер(от 2-ух или более пользователей) => Передаём данные пользователей друг другу => Вписываем данные в память Хочу использовать данную схему в одиночной игре. Например: берём координаты одного пользователя и отсылаем другому и вписываем в память. Реально ли?... подробнее

Показать сообщение отдельно
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6165 / 2894 / 282
Регистрация: 04.12.2011
Сообщений: 7,694
Записей в блоге: 3
20.03.2014, 04:26     Ошибка при передаче двумерного массива в функцию
Цитата Сообщение от Leinstay Посмотреть сообщение
Хотя все же не пойму от чего такая сложность
От того, что внутренне, стековый массив одномерен. Он не является массивом массивов и не передается как массив указателей. Но можно передать по ссылке:
a[3][3];
//чем-то заполнили

//опрелеление ф-ции
foo(int a[3][3]){//
или
foo( int (&a)[3][3]){//
Последнее измерение можно не указывать.

Тогда в foo можно работать с переданным массивом как с 2-мерным (n-мерным).
Или используйте динамически создаваемые массивы. Их легко передавать указателями (на указатели)) и размерами.

Добавлено через 16 часов 0 минут
Цитата Сообщение от Leinstay Посмотреть сообщение
Спасибо ребят, очень выручили. Хотя все же не пойму от чего такая сложность и как придется выходить из ситуации с, например, многомерным массивом.
Leinstay, я тут мутновато наговорил. Добавлю ещё.
Вот, расковырял один пример и попытался сделать так, чтобы вызов для автоматического и динамического массива были формально одинаковы. То есть, в точке вызова передаём имя и измерения:
Кликните здесь для просмотра всего текста
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
#include <iostream>
using namespace std;
//для массива еа стеке
template<int n, int m, class T>
T summ( T (&a)[n][m], int n, int m){//в этом случае n и m можно было не передавать, но для единообразия вызовов)
T sum = 0;
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
sum += a[i][j];
return sum;
}
 
//для динамического
template< class T>
T summ( T **a, int n, int m){// тут же нужно передать
T sum = 0;
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
sum += a[i][j];
return sum;
}
 
int main()
{
    
    const int m = 4;
 
    int a[][m] = {
        { 1, 2,   3,  4},
        { 5, 6,   7,  8},
        { 9, 10, 11, 12}
    };
const int n = sizeof( a )/( sizeof( a[0][0] ) * m );
 
cout << summ(a, n, m)<<endl;//
 
float **b = new float*[m];
for(int j = 0; j < m; ++j)
b[j] = new float[n];
for(int i = 0; i < n; ++i)
    for(int j = 0; j < m; ++j)
b[i][j] = a[i][j];
 
cout << summ(b, n, m)<<endl;//
 
system ( "pause" );
    return 0;
}

То есть, не радостно. Особенно учитывая, что читая такое и не видя объявлений, легко запутаться. Лучше с такими вещами поступать по-разному. Тогда, по крайней мере не захочется освободить память из под массива на стеке.
 
Текущее время: 20:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru