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

Функции, передача массива в качестве параметра - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Ошибка в работе с классом "очередь" http://www.cyberforum.ru/cpp-beginners/thread53338.html
Скажите пожалуйста, почему указатель на хвост очереди после инициализации всегда направлен в NULL, а на голову в адрес 158? (через конструктор программа проходит нормально) Почему функция заполнения не вносит никаких изменений, видимых при трассировке указателей tail и head, а также значений, содержащихся в их ячейках? Кажется, я тут что-то фундаментальное упустил, а понять не могу. #include...
C++ Дать совет по ООП Скажите, на какой вид проектов на студии 2005 стоит переходить после изучения полностью консоли на с++ в студии 2005, чтоб писать полноценные приложения виндоус на форме с использованием кнопок и т.д. http://www.cyberforum.ru/cpp-beginners/thread53334.html
C++ Работа с графикой
Доброго времени суток ув. форумчане. Вобщем так, я еще совсем новичок, пытаюсь написать программу, задача ее в том чтобы выводить на экран текст нужного цвета. Работаю в Dev C++. Сначала проблема была в том что там отсутствовала графическая библиотека graphics.h, я ее нашел и установил. А теперь я не могу понять как заставить программу вывести текст и придать ему цвет, так как рисовать...
C++ Нужен коментарий
Народ прокоментируйте этот код: #pragma once template <class T> struct TreeEl{ T data; TreeEl<T> *pLeft,*pRight,*pParent; TreeEl(T d):data(d),pLeft(0),pRight(0),pParent(0) {}
C++ Массив на 200 элементов http://www.cyberforum.ru/cpp-beginners/thread53319.html
Задача в С . дан массив размером 200, заполнить его случайными числами в интервале от -50 до 50 . Далее определить какое значение встречается в массиве чаще остальных и вывести на экран какое это значение и сколько раз оно встречается ?
C++ вывод пикселя Привет всем. Мне нужна ваша помощь. Вообщем задание таково: Построить программу, которая вводит координаты точки (x, y) и определяет, попадает ли точка в заштрихованную область на рисунке, который соответствует Вашему варианту(рисунок прикреплен ). Попадание на границу области считать попаданием в область. Вообщем я написал прогу все работает кроме: я ввожу координаты пикселя, пиксел... подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,146
Записей в блоге: 26
01.10.2009, 14:29     Функции, передача массива в качестве параметра
Цитата Сообщение от Rififi Посмотреть сообщение
В этом случае не работало потому, что функция ожидала указатель, а передавался двумерный массив. Одно в другое не приводится.
Двухмерный массив в приницпе не может передаваться. Просто ожидался параметр типа "указатель на int" или "указатель на одномерный массив int'ов" (оба термина эквивалентны), а передавался "указатель на двухмерный массив int'ов". В Си\Си++ подобные неявные преобразования между разными типами указателей запрещены

Однако я понимаю, чем вызван вопрос #pragm'ы, а потому просто отвечу конкретным исходником

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
#include <stdio.h>
 
void
func (int *arr, int n1, int n2)
{
  int i, j;
 
  for (i = 0; i < n1; i++)
    for (j = 0; j < n2; j++)
      printf ("%d\n", *(arr + i * n2 + j));
}
 
int
main (void)
{
  int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6} };
  int b[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8}, { 9, 10, 11, 12 } };
 
  printf ("-----\n");
  func ((int*)a, 2, 3);
  printf ("-----\n");
  func ((int*)b, 3, 4);
  printf ("-----\n");
  return 0;
}
Т.е. можно передавать и так, но при таком способе доступ к элементам массива можно осуществлять только через адресную арифметику, но нельзя через квадратные скобки. При этом такой метод оказывается более универсальным, чем метод Rififi, т.к. в его случае можно передавать только массив с какими-то фиксированными количествами по обоим измерениям. В мой способ можно передавать вообще массив с произвольным количеством измерений, нужно только более аккуратно подавать описатели размерностей. Но в такие крайности без какой-то необходимости впадать не следует

В языке C99 (и в GNU C) есть понятие VLA - variable length array. Возможно, что на современных виндовых компиляторах это тоже поддерживается, а потому можнонаписатьболее элегантно. При этом надо понимать, что это не есть "станадртный Си" (условнообзову именно этим термином)

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
#include <stdio.h>
 
void
func (int n1, int n2, int arr[n1][n2])
{
  int i, j;
 
  for (i = 0; i < n1; i++)
    for (j = 0; j < n2; j++)
      printf ("%d\n", arr[i][j]);
}
 
int
main (void)
{
  int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6} };
  int b[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8}, { 9, 10, 11, 12 } };
 
  printf ("-----\n");
  func (2, 3, a);
  printf ("-----\n");
  func (3, 4, b);
  printf ("-----\n");
  return 0;
}
 
Текущее время: 11:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru