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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Если это таки С-шная строка (т.е. после всех символов в массиве записан 0), то strstr

Код: Выделить всё

#include <string.h>
char array[200];

// -1 -- в массиве нет подстроки "lol"
int lol_index()
{
        const char *= strstr(array, "lol");
        if (p==0) return -1;
        return p - array;
}
 

А если таки массив с заданной длиной, но без 0-ограничителя, то... То я бы постарался изменить подход в программе в пользу строк.

Если же это неизменяемое учебное задание, то тогда похожее на уже написанное:

Код: Выделить всё

// Если в массиве 200 символов, то "lol" не может начаться позже (200-3)-его символа,
// так как просто не влезет
// Возврат индекса иди -1, если не нашлось
int lol_index()
{
    unsigned char i;
    for (= 0; i < 200-3; ++i) {
        if (array[i] == 'l' && array[i+1] == 'o' && array[i+2] == 'l')
            return i;
    }
    return -1; // не нашлось
} 
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Реклама
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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

Сообщение спящий »

я правиль но понял?


#include <string.h>
char array[10] = {45,54,a,d,v,l,o,l,s,45,13};

// -1 -- в массиве нет подстроки "lol"
void lol_index()
{
const char *p = strstr(array, "lol");
}

void main(){

lol_index();
Printf('vivod ',p);

}

будет :
vivod 5

так как первая 'l' 5 в массиве?
Реклама
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

strstr возвращает указатель на первый символ найденной подстроки (или 0, если она не найдена).
смотри по линку из моего сообщения описание функции.
Чтобы получить смещение от начала строки, надо из указателя p вычесть адрес начала массива (указатель на его первый элемент, к которому в выражениях автоматически приводится имя массива). Как у меня там и написано

Код: Выделить всё

    return p - array; 
Можно так, немного многословнее, но немного понятнее (и тождественно с точки зрения компилятора

Код: Выделить всё

    return p - &array[0]; 

Ну и у тебя в коде Printf не достанет до p, так как p -- локальная в lol_index()
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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

Сообщение спящий »

короче говоря выдает адресс первого символа?) а если у меня в массиве несколько 'LOL' ?надо будет читать функцией заново+ смещение на адресс первого слово?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Да, адрес первого символа. Если нужно найти все, то опять вызывать, пока до 0 не дойдёт.
А вот смещение на один символ или на длину слова поиска -- зависит от требований.
Если нужно найти так:

Код: Выделить всё

1234lololol5678
----lol--------
------lol------
--------lol----
то искать начиная, вообще говоря, со следующего символа:

Код: Выделить всё

    const char *= array; // начинаем искать от начала массива
    const char *pstr = "lol";

    while ( (= strstr(p,pstr)) != 0 ) { // заменяем текущий адрес начала поиска новым найденным и проверяем на 0
        printf( "Index %d\n", p - array);
        ++p; // продолжаем искать со следующего символа
    }
 
"lol" можно искать с через-одного, так как второй символ искомого не равен первому, но если искать "aaa", то надо начинать со следующего, чтобы в "123aaaa456" найти два "aaa"

А если нужно

Код: Выделить всё

1234lololol5678
----lol--------
--------lol----
то тогда отступать на размер искомой подстроки

Код: Выделить всё

    const char *= array; // начинаем искать от начала массива
    const char *pstr = "lol";
    int step = strlen(pstr);

    while ( (= strstr(p,pstr)) != 0 ) {
        printf( "Index %d\n", p - array);
        p += step; // продолжаем искать с символа за концом найденного
    } 
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Реклама
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

Всем привет! Возникла проблема с множественными определениями.
Пишу в kеil.
Вот пример ашника, который уже порядком меня достал :(

Код: Выделить всё

"код" файла LEDDISP.H

#ifndef LEDDISP_H
#define LEDDISP_H
бла бла бла
#endif


подрубаю его в двух местах :

Код: Выделить всё

" Код " файла LedDisp.c
#include "C8051F410.h"
#include "LEDDISP.h"
бла бла


Код: Выделить всё

"код" файла Timers.c
#include "C8051F410.h"
#include "LEDDISP.h"
 бла бла


выдает ошибку
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
SYMBOL: БЛА
MODULE: Timers.obj (TIMERS)
Не могу понять где собака зарыта (( Ведь юзаю директивы препроцессора #ifndef
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Реклама
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

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

Сообщение U235 »

А что за символ? В смысле что конкретно Вы определяете?
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

Уже решил проблему. Просто ночью спать надо, а не коды ковырять ) Не замечал косяк один. Сейчас другая проблема. Не могли бы вы мне на пальцах объяснить как перевести число из Hex в Dec? Что то в голову ничего путного не пришло :( Мне надо обработать сигнал с АЦП и результат вывести на LED индикатор.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

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

Сообщение U235 »

Можно использовать sprintf для получения строки с ansii символами. А потом из каждого символа вычесть 0x30.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Мне надо обработать сигнал с АЦП и результат вывести на LED индикатор.

Что это за АЦП такой, который результат в хексах даёт?
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

ploop писал(а):Что это за АЦП такой, который результат в хексах даёт?

Видимо, мсье просто надо перевести число в цифры :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Ну для этих целей в Сях полно всяких printf'ов, как самописных, так и библиотечных...
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

ИМХО, подобные вопросы нужно тупо игнорировать - дать подумать человеку и понять что он глупость сморозил.
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

Аlex писал(а):ИМХО, подобные вопросы нужно тупо игнорировать - дать подумать человеку и понять что он глупость сморозил.

Ага, тогда народ тупой уйдет туда, где ему помогут. Гений,блин.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Chip115 писал(а):тогда народ тупой уйдет туда, где ему помогут

http://we.easyelectronics.ru/Soft/preob ... hisla.html
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Chip115 писал(а):Ага, тогда народ тупой уйдет туда, где ему помогут. Гений,блин.
Уважаемый, пока Вы не научитесь правильно излагать мысль, Вас будут везде "тыкать носом в то место, где Вы нагадили". Сядьте и почитайте что такое hex и dec. Только нормально читайте, без "зачем мне это нужно, я и так всё знаю". И тогда Вы поймёте, что задаёте тупые вопросы.
Вам задали вопрос:
Что это за АЦП такой, который результат в хексах даёт?
Где ответ на него ? Правильно... Вы сами не знаете что хотите и не понимаете о чём говорите. Разберитесь сначала в своих мыслях, потом уже задавайте вопрос.
Во вторых. Подобным умникам, "угрожающим" куда-то там уйти, обычно говорят - Валите, Вас тут никто не держит, и никто ничем не обязан.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Алекс, нехорошо говорите, минус вам вроде модератор, а так грубо.

Человеку вроде нужно на Led выводить, а ему строки пихают.

Если нужно на led индикатор вот есть не очень конечно пример, но в общем понятно.

Код: Выделить всё

 bin2bcd32(unsigned long int x){
//unsigned short bcd[8];
unsigned short digits = 8;
 
bin2bcd32_Loop
:
            bcd[digits] = x % 10;
                if(x<=9)
                bcd[digits] = x;
            else{
                x = x / 10; 
                  digits 
= digits - 1;
                   goto bin2bcd32_Loop;
            }
          }  

Тут получается в массиве bcd хранятся числа разрядов отдельно.Можно еще доработать

Код: Выделить всё


 bcd
[digits] = numbers[% 10];
            if(x<=9)
                bcd[digits] = numbers[x];  

где в массиве numbers записаны сегменты, которые должны активироваться при показе какой либо цифры.
Вывод на индикатор уже посимвольно из массива в динамической индикации.

PS Chip115 запомните, в Мк и вообще в любом компьютере все числа хранятся в двоичном формате.А то что вы пишете 0xFF или 255 это для вашего удобства сделано и уже просто компилятор переводит в бинарный формат.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Флуд убрал. Не забывайте, это технический раздел.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Алекс, нехорошо говорите, минус вам вроде модератор, а так грубо.
Вполне адекватный ответ на его грубость. И модераторство тут не причём, мы такие-же участники.

Человеку вроде нужно
Вот оно, ключевое слово - "вроде". Вроде, вроде, .... и все гадают - "а что-же ему нужно" ? А ему всего-лишь нужно правильно изложить свою мысль. А он, видимо, сам в них запутался.
То, что ему нужно выводить на Led, это я видел и об этом речи не шло. Речь шла о переводе из hex в dec. Это самый глупый вопрос новичков, не желающих читать и думать. hex и dec - это всего-лишь представление числа в разных системах, т.е. разная форма его записи, которую сам компилятор и переведёт в нужный ему формат.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Из разряда флуда.Каждый новичок имеет право на ошибку или заблуждение, между прочим вы сами начали говорить о том что вопрос тупой и не нужно на него отвечать.Тут его и прорвало.Три ответа и ни в одном нет того, что он спросил.Может для вас это элементарно, а новички могут не понимать что нужно в другом месте искать, а не там, где они думают ответ есть.
судя по вашим репликам нужно знать половину ответа чтобы задать вопрос.
Уж простите, если что не так сказал, но такое мое мнение.
Можно не игнорируя, не оскорбляя и не отвечая прямо направить человека в нужное русло.Даже можно довольно просто наводящими вопросами довести до истины.

Давайте жить дружно.А?
Ответить

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