Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

Массив хоть структур, хоть элементарных типов, все равно содержит сущности одинаковых размеров. И обращаться к ним можно по индексу.

Но, похоже, речь идет о байтовом буфере, в котором подряд идут записи разных структур, как, например, строки в файле или теги в файле riff-формата. В этом случае, не зная длины записи заранее, кроме как побайтовым перебором, ничего никуда передать не выйдет. А если, предположим, первый байт содержит длину записи, то уже ясно, что надо использовать указатель и эту длину для передачи куда надо и последующего "наращивания" указателя...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Вопросы по С/С++ (СИ)

Сообщение Ivanoff-iv »

у меня в кодевижене работало так (ноута под рукой нет, чтоб точно синтаксис глянуть, но смысл ясен):
#define func(x) func(x, length(x))
и в функцию сразу летит и указатель на начало и размер массива...
но имя массива в этом случае надо указывать явно (переданные по ссылке не прокатят) т.ч. это только сахарок, не более... :dont_know:

ещё делал так: массив с указателями начал подмассивов, а первый элемент подмассива - его длина (про это тут уже написали), также можно и в массив с указателем длину разместить в следующей ячейке, (получается пара адрес-размер) тут уж как удобнее :solder:
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Shuspano
Грызет канифоль
Сообщения: 270
Зарегистрирован: Вс окт 20, 2019 13:03:56

Re: Вопросы по С/С++ (СИ)

Сообщение Shuspano »

Добрый день. Написал программку управления регистром через LPT-порт, и все вроде получилось. Не могу понять почему возник сегфолт, хотя "пять минуть назад все работало", просто строчку в pattern[] поменял. В общем, на ровном месте. Гуголь и дикпи.. дипсик ничего внятного сказать не могут.
Выяснено что сегфолт возникает на вызове 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);
    }
}
У меня Debian 13 и компилятор GCC14
Аватара пользователя
главный колбасист
Это не хвост, это антенна
Сообщения: 1323
Зарегистрирован: Чт авг 21, 2014 11:11:48
Откуда: краснодарский край
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение главный колбасист »

ну вы с такими вопросами,в такой день... :facepalm:
Ответить

Вернуться в «Разные вопросы по МК»