Как передать в функцию указатель на двумерный символьный массив?
void main(void)
{
int i;
const int Size=10;
char Plug[Size][20];
Function(Plug, Size);
for(i=0; i<Size; i++)
printf("\r\n %d \r\n",Plug[i]);
_getch();
}
void Function(char **plugs, int size)
{
char str[10];
for(int i=0; i<size; i++)
{
sprintf(str," %d",i);
strcpy(plugs[i], str);
}
};
.....
Cells = new char* [N1];
for (i = 0; i < N1; i++) {
Cells[i] = new char[N2];
}
P.S. Вот еще пример, в C-стиле и с дин. выделением памяти только на одно из измерений.
#include <iostream>
using namespace std;
void prnt_adress(signed char**, int, int);
int main() {
int i,j;
const int N1 = 3;
const int N2 = 2;
const signed char src[N1][N2] = {
{1, 2},
{3, 4},
{5, 6}
};
signed char array[N1][N2];
signed char** Cells;
signed char* ar[N1];
Cells = new signed char* [N1];
for (i = 0; i < N1; i++) {
ar[i] = new signed char[N2];
Cells[i] = new signed char[N2];
}
for (i = 0; i < N1; i++)
for (j = 0; j < N2; j++) {
array[i][j] = src[i][j];
Cells[i][j] = src[i][j];
ar[i][j] = src[i][j];
}
cout << "Значение ячейки (смещение адреса) в src\n";
for (i = 0; i < N1; i++, cout << endl)
for (j = 0; j < N2; j++, cout << '\t')
cout << (int)src[i][j] << "(" <<
(&src[i][j]-&src[0][0]) << ")";
cout << endl;
cout << "Значение ячейки (смещение адреса) в array\n";
for (i = 0; i < N1; i++, cout << endl)
for (j = 0; j < N2; j++, cout << '\t')
cout << (int)array[i][j] << "(" <<
(&array[i][j]-&array[0][0]) << ")";
cout << endl;
cout << "Значение ячейки (смещение адреса) в Cells\n";
prnt_adress(Cells, N1, N2);
cout << endl;
cout << "Значение ячейки (смещение адреса) в ar\n";
prnt_adress(ar, N1, N2);
for (i = 0; i < N1; i++) {
delete[] ar[i];
delete[] Cells[i];
}
delete[] Cells;
return 0;
}
void prnt_adress(signed char** ar2d, int k1, int k2) {
for (int i = 0; i < k1; i++, cout << endl)
for (int j = 0; j < k2; j++, cout << '\t')
cout << (int)ar2d[i][j] << "(" <<
(&ar2d[i][j]-&ar2d[0][0]) <<
")";
};
void Foo(char (&plugs)[count][length]) {
char str[length];
for(int i = 0; i < count; i++)
{
sprintf(str," %d",i);
strcpy(plugs[i], str);
}
}
В каком смысле не поможет? Ошибки компиляции не будет? Не будет.
void Foo(char (&plugs)[count][length]) {
char str[length];
for(int i = 0; i < count; i++)
{
sprintf(str," %d",i);
strcpy(plugs[i], str);
}
}
А что это за интересное использование темплейтов?
Здесь, скорее, интересное использование вывода аргументов шаблона из использования - пожалуй, единственный способ не потерять информацию о типе при передаче массива в качестве аргумента. Можно принять за идиому.
#include <clocale>
#include <cstdio>
#include <iostream>
using namespace std;
typedef double DATA_TYPE;
DATA_TYPE multi(DATA_TYPE **p, int k, int t);
int main() {
setlocale(LC_ALL,"");
const int m = 2, n = 3;
DATA_TYPE **r;
r = new DATA_TYPE*[m];
cout << "Адреса одномерных массивов:" << endl;
for (int i = 0; i < m; i++) {
r[i] = new DATA_TYPE[n];
cout << (unsigned)r[i] << endl;
}
cout << "Размер типа данных в байтах: " << sizeof(DATA_TYPE) << endl;
DATA_TYPE k = -2.0;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++) {
r[i][j] = (k += 1.0, k);
cout << "r[" << i << "][" << j << "] = " << r[i][j] <<
", адрес: " << (unsigned)&(r[i][j]) << endl;
}
cout << endl << "Произведение: " << multi(r, m, n) << endl;
for (int i = 0; i < m; i++)
delete[]r[i];
delete[]r;
cout << endl << "Нажмите клавишу...";
getchar();
return 0;
}
DATA_TYPE multi(DATA_TYPE **p, int k, int t) {
DATA_TYPE w = 1.0;
for (int i = 0; i < k; i++)
for (int j = 0; j < t; j++)
//if (p[i][j]>0) w = w*p[i][j];
if ( *(*(p+i)+j) >0 ) w *= *(*(p+i)+j); //то-же через указатели
//адрес элемента получаем по адресу начала его одномерного массива
//и положению элемента в нем
return w;
}
DATA_TYPE w = 1.0;
const void* max_pp = p + k;
for (DATA_TYPE** pp = p; pp < max_pp; pp++)
for (int j = 0; j < t; j++)
if ( *(*pp+j) >0 ) w *= *(*pp+j);
return w;
}
Да, тут для 32-битных машин. Под 64-битные не трудно переделать.
Здесь, скорее, интересное использование вывода аргументов шаблона из использования - пожалуй, единственный способ не потерять информацию о типе при передаче массива в качестве аргумента. Можно принять за идиому.
На настоящую идиому наверно не тянет (в сравнении с RAII, например), но прием полезный.
Даже обычное использование ссылок на (статический) массив позволяет уйти от явной передачи размерности:
const int cnt = sizeof(ra) / sizeof(ra[0]);
for(int i = 0; i < cnt; ++i)
ra[i] = i;
}
typedef int (&Ref_to_array)[10];
void fill_array2(Ref_to_array ra) {
const int cnt = sizeof(ra) / sizeof(ra[0]);
for(int i = 0; i < cnt; ++i)
ra[i] = -i;
}
...
int C[10];
fill_array(C);
for(int i = 0; i < 10; ++i)
printf("%d ", C[i]);
puts("");
fill_array2(C);
for(int i = 0; i < 10; ++i)
printf("%d ", C[i]);
Напрашивается вынести в константы размерность:
typedef int (&Ref_to_array)[CNT];
void fill_array3(int (&ra)[CNT1][CNT2]) {
int k = 1;
for(int i = 0; i < CNT1; ++i)
for(int j = 0; j < CNT2; ++j)
ra[i][j] = k++;
}
...
int C[2][3];
fill_array3(C); //даже не обязательно fill_array3<2,3> (автоматически выводятся)
P.S. C динамич. массивом (с помощью new созданного) не сработает. Например, такое не верно:
//int *D = new int[10];
//fill_array(D);
//...
//delete [] D;
Да-Да массив передаст значения ~~ char* ar[N].
Честно сказать , мне по кухне Ваши ответы ~~38 годов кнопаю клаву и сделал свою(карьеру), но что обидно я типа начальник (теперь)
Если не ошибаюсь русский певец ~~Полотно слова:
~~Я всё реже достаю свою гитару и всё реже пою. рекомендую послушать
Примерно так
Я всё реже достаю клаву и всё реже пишу код.
P/S А.Полотно
На Севере
Снег разтаил