Массив хоть структур, хоть элементарных типов, все равно содержит сущности одинаковых размеров. И обращаться к ним можно по индексу.
Но, похоже, речь идет о байтовом буфере, в котором подряд идут записи разных структур, как, например, строки в файле или теги в файле riff-формата. В этом случае, не зная длины записи заранее, кроме как побайтовым перебором, ничего никуда передать не выйдет. А если, предположим, первый байт содержит длину записи, то уже ясно, что надо использовать указатель и эту длину для передачи куда надо и последующего "наращивания" указателя...
Вопросы по С/С++ (СИ)
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Вопросы по С/С++ (СИ)
у меня в кодевижене работало так (ноута под рукой нет, чтоб точно синтаксис глянуть, но смысл ясен):
#define func(x) func(x, length(x))
и в функцию сразу летит и указатель на начало и размер массива...
но имя массива в этом случае надо указывать явно (переданные по ссылке не прокатят) т.ч. это только сахарок, не более...
ещё делал так: массив с указателями начал подмассивов, а первый элемент подмассива - его длина (про это тут уже написали), также можно и в массив с указателем длину разместить в следующей ячейке, (получается пара адрес-размер) тут уж как удобнее
#define func(x) func(x, length(x))
и в функцию сразу летит и указатель на начало и размер массива...
но имя массива в этом случае надо указывать явно (переданные по ссылке не прокатят) т.ч. это только сахарок, не более...
ещё делал так: массив с указателями начал подмассивов, а первый элемент подмассива - его длина (про это тут уже написали), также можно и в массив с указателем длину разместить в следующей ячейке, (получается пара адрес-размер) тут уж как удобнее
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: Вопросы по С/С++ (СИ)
Добрый день. Написал программку управления регистром через LPT-порт, и все вроде получилось. Не могу понять почему возник сегфолт, хотя "пять минуть назад все работало", просто строчку в pattern[] поменял. В общем, на ровном месте. Гуголь и дикпи.. дипсик ничего внятного сказать не могут.
Выяснено что сегфолт возникает на вызове sh_out(x).
У меня Debian 13 и компилятор GCC14
Выяснено что сегфолт возникает на вызове sh_out(x).
Код: Выделить всё
#include <stdio.h>
#include <unistd.h>
#include <asm/io.h>
#define base 0xD100
#define time 500000
#define DS 0
#define ST_CP 1
#define SH_CP 2
int sh_out(unsigned char sh_data) {
int i = 0;
unsigned char out;
out &= ~(1 << ST_CP);
outb (out, base);
for(i = 0; i < 8; i++) {
out &= ~(1 << SH_CP);
outb (out, base);
if (sh_data & 0x80) {
out |= (1 << DS);
outb (out, base);
} else {
out &= ~(1 << DS);
outb (out, base);
}
sh_data = sh_data << 1;
out |= (1 << SH_CP);
outb (out, base);
}
out |= (1 << ST_CP);
outb (out, base);
}
int main() {
int j = 0;
unsigned char pattern[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02};
unsigned char temp = 0;
if (ioperm(base, 3, 1)) {
perror("ioperm");
return 1;
}
while(1) {
temp = pattern[j];
sh_out(temp);
j++;
if (j == sizeof(pattern)) j = 0;
usleep(time);
}
}- главный колбасист
- Это не хвост, это антенна
- Сообщения: 1323
- Зарегистрирован: Чт авг 21, 2014 11:11:48
- Откуда: краснодарский край
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
ну вы с такими вопросами,в такой день... 