Foxter.ru

Foxter.ru (https://www.foxter.ru/index.php)
-   Программирование (https://www.foxter.ru/forumdisplay.php?f=60)
-   -   C++ (https://www.foxter.ru/showthread.php?t=485)

aus_gift 08.01.2007 10:55

по поводу "cout"...
 
Пример из книги "Полный справочник по С++" 4-ое издание, Герберт Шилдт:


#include <iostream>
#include <cstring>
using namespace std;

class phonebook {
public:
char name[80];
int areacode;
int prefix;
int num;
phonebook(char *n, int a, int p, int nm)
{
strcpy(name, n);
areacode = a;
prefix = p;
num = nm;
}
};

// Display name and phone number.
ostream &operator<<(ostream &stream, phonebook o)
{
stream << o.name << " ";
stream << "(" << o.areacode << ") ";
stream << o.prefix << "-" << o.num << "\n";

return stream; // must return stream
}

int main()
{
phonebook a("Ted", 111, 555, 1234);
phonebook b("Alice", 312, 555, 5768);
phonebook c("Tom", 212, 555, 9991);

cout << a << b << c;

return 0;
}

.....

Kostyan 14.04.2007 16:19

Может кто нить сможет разрешить маленький нюанс. Дело в следующем: апишная функция GetModuleFileName получает во втором параметре указатель на строковый буфер, в котором возвращает полное имя файла (полное, т.е. типа "C:\mydir\my_subdir\filename.exe"), которое собсна мне и не требуется. Мне необходимо из этой строки взять тольно непосредственно имя файла (filename.exe). Каким образом это можно было бы реализовать? Я сделал следующим образом, но как то криво мне кажецца. Отматывал указателем с конца строки до первого бекслеша и копировал дальше в буффер:

Код:

GetModuleFileName(NULL,&NameBuffer[0],MAX_PATH);
        DWORD StringLenght=lstrlen(&NameBuffer[0]);
       
        char* lpNameBuffer=&NameBuffer[StringLenght-1];
        do{
                --lpNameBuffer;
        }while(*lpNameBuffer!='\x5C');

        char* lpShortName=ShortName;
        do{
                ++lpNameBuffer;
                *lpShortName = *lpNameBuffer;
                ++lpShortName;
        }while(*lpNameBuffer!='\0');

        printf("ShortName: %s\n",&ShortName[0]);

Может есть другой способ?

ЗЫ функцию fnsplit() не предлагать =)

elkozlova 20.10.2007 16:44

А чем тебе не нравится этот способ?

AnarCky 02.01.2008 14:24

дело в том, что cout это объект пространства имен std и его использование делает акцент на Объектно-Ориентированном Программировании, а поскольку С++, в отличии от С, задумывался как ОО язык, то и ясно, что именно про cout писать будут.

Kostyan 05.01.2008 13:08

Блин, юзайте prinft(...), нормальная функция форматированного вывода... но суть вопроса не в этом, собсно говоря.

Подскажите, если кто знает, что за технология такая хитрая, LSP (Layered Service Provider), это из серии "снифферы". Сниффер на сырых сокетах хватает только входящие пакеты, мне же надо бы и исходящие поймать. На всех форумах рекомендуют либо NDIS драйвер либо вот именно эту технологию... а описания что то нигде найти не могу, даже в MSDN как то все плохо. Кто нибуть что нибуть знает? =)

PS сорри, уже не надо думаю =) мелкомяхкие вроде рассматривают такой вопрос, надо учить англицкий.

Alraminar 24.01.2008 21:00

когда мы начали изучать С у нас возник вопрос какой Х.. это придумал и что он курил... так изощриться нормальный человек не мог...

Rocker_dead 01.06.2008 14:48

Добрый день =) Такая ситуация:
На работе нужно программить порты, и мне сказали это делать под ДОСом, в Турбо С. cout и cin не пашут (от чего - понимаю, но это не важно), юзаю scanf и printf. Так вот, при выводе массива символов (допустим "1001110011") программа некоторые единицы заменяет на "(null)". Никто не подскажет, чё это за лажа такая?(

Kostyan 03.06.2008 16:34

Rocker_dead, ты бы хоть сорцы выложил. Или фрагмент с функцией.

Rocker_dead 03.06.2008 17:11

Kostyan

Код:

#include <stdio.h>
#include <conio.h>
#include <string.h>
main()
{
int a[16], z[16];
int i, j;
char m, str[9], mark[9]="01111111";
printf("Vvedite bite-marker \n");
scanf("%s", str);
if (strcmp(mark,str))
printf("ERROR");
else
printf("Vvedenniy bite marker verniy - 0x7f \n Vipolnit' poisk?");
m=getch();
printf("%c", m);
if (m=='y')
printf("Vvedite massiv is 16 znakov \n");
for (i=0;i<16;i++)
{scanf("%d", a[i]); printf("\n");
for (i=0;i<16;i++)
printf("%d", a[i], " ");
/*Searching*/
for (i=0;i<9;i++)
    {
    if (a[i]==0 && a[i+1]==1 && a[i+2]==1 && a[i+3]==1 && a[i+4]==1 && a[i+5]==1 && a[i+6]==1 && a[i+7]==1)
        {z[i]=a[i]; z[i+1]=a[i+1]; z[i+2]=a[i+2]; z[i+3]=a[i+3]; z[i+4]=a[i+4]; z[i+5]=a[i+5]; z[i+6]=a[i+6]; z[i+7]=a[i+7]; i=i+8;}
        else
        z[i]=0;
    }
for (j=9;j<16;j++)
    {z[j]=0;}
printf("\n");
for (i=0;i<16;i++)
{printf("%d", z[i], " ");}
getch();
}return 0;}


Kostyan 12.06.2008 09:36

Rocker_dead, если честно, посмотрел я сорец и чегото плохо его осилил... обратил внимание на явные баги (трудно мимо пройти), но смысл алгоритма не очень... пить закончу, потом может разберусь...

Rocker_dead 15.06.2008 17:40

Kostyan, укажи тогда хоть на баги

Kostyan 22.06.2008 14:09

Rocker_dead,баги может и не совсем баги, а так, недочеты, но...
рассмотрим исходник:

1.
char m, str[9], mark[9]="01111111";
printf("Vvedite bite-marker \n");
scanf("%s", str);

if (strcmp(mark,str))
printf("ERROR");
else
printf("Vvedenniy bite marker verniy - 0x7f \n Vipolnit' poisk?");


не совсем понятный фрагмент. Здесь программа просит ввести бит маркер, затем сравнивает его с эталонным (0х7F) и если введен неправильный маркер выдается ошибка. Тогда я не понимаю, какой вообще смысл запрашивать его у пользователя? Не проще ли зашить его жестко в программу? Потом, здесь же, если введенный бит маркер неверен, программа просто выбросит еррор и... продолжит выполняться дальше. Разве что мы не увидим приглашение о поиске.
И кстати, дальше в программе ты в цикле проверяешь какие то данные с этим бит маркером, жестко зашитим жестко в проге.

2.
if (m=='y') printf("Vvedite massiv is 16 znakov \n");

следующий фрагмент. Мы проверяем ответ пользователя (y/n) и если у, то выводим сообщение на экран и все. программа опять же продолжит выполняться в том же направлении. Тогда смысл подобной проверки?

Касательно двух вышеприведенных фрагментов я так понимаю, что ты решил не злоупотреблять фигурными скобками и переусердствовал?


3.
for (i=0;i<16;i++)
{
scanf("%d", a[i]);
printf("\n");
for (i=0;i<16;i++) printf("%d", a[i], " ");
/*Searching*/
for (i=0;i<9;i++)
{
if (a[i]==0 && a[i+1]==1 && a[i+2]==1 && a[i+3]==1 && a[i+4]==1 && a[i+5]==1 && a[i+6]==1 && a[i+7]==1)
{
z[i]=a[i];
z[i+1]=a[i+1];
z[i+2]=a[i+2];
z[i+3]=a[i+3];
z[i+4]=a[i+4];
z[i+5]=a[i+5];
z[i+6]=a[i+6];
z[i+7]=a[i+7];
i=i+8;
}
else
z[i]=0;
}
for (j=9;j<16;j++)
{
z[j]=0;
}
printf("\n");
for (i=0;i<16;i++)
{
printf("%d", z[i], " ");
}
getch();
}

насчет этого фрагмента. Тут чего то я вообще запутался, равно как и мой отладчик. Вложенные циклы и все такое. Ты используешь переменную i для основного цикла, потом ее же используешь для вложенного. Ладно, это ерунда, так можно делать, но ты не учел, что после первого же вложенного циклапеременная у тебя принимает последнее значение, т.е. 16...


короче, смотри сам, программа непонятная, чего она делает я пока не разобрался (пью пока еще).... расскажи хоть алгоритм для начала, там бы подумали...


ЗЫ а сегодня день траура... 22 июна в 4 часа утра 1941 года началось вторжение немецких войск на территорию СССР... если кто помнит

Rocker_dead 23.06.2008 22:25

Kostyan, во-первых - спасибо тебе большое за то, что откликнулся.

Цитата:

Сообщение от Kostyan
сегодня день траура...

Да, помним...

Цитата:

Тогда я не понимаю, какой вообще смысл запрашивать его у пользователя?
Это просто так, для наглядности, программа не работает на какой то эффект.
Цитата:

расскажи хоть алгоритм для начала, там бы подумали...
После прохождения проверки маркера на вход программы (теоретически с порта) идёт последовательность 0 и 1. и нужно определить наличие в ней этого маркера и вывести эту последовательность, оставив единицы тока этого бит-маркера, а остальное заполнить нулями

Kostyan 27.06.2008 01:38

Rocker_dead, все, кажется вкурил. Тогда сдается неправильно реализовал идею.. хотя бы тут:

Код:

if (a[i]==0 && a[i+1]==1 && a[i+2]==1 && a[i+3]==1 && a[i+4]==1 && a[i+5]==1 && a[i+6]==1 && a[i+7]==1)
ты здесь случайно не путаешь байты и биты?

я тут прикинул пару вариантов, посмотри, может чем то поможет.
1. банально посимвольное сравнение (даем проге символ, он сравнивается со всеми вытекающими.. ):
Код:

#include <stdio.h>
#include <conio.h>

int main()
{
        int symbol=0;
        int bit_marker = 0x7F;        //        0x01111111b
        printf("start: \n");
        for(;;)
        {
                symbol = getch();
                if(symbol==bit_marker)
                {
                        printf("symbol found: %02X\n",symbol);
                }
                else
                {
                        symbol=0;
                        printf("symbol: %02X\n",symbol);
                }
        }
        return 0;
}

2. тут в принципе тоже самое, только эмулируется битовый последовательный поток:
Код:

#include <stdio.h>
#include <conio.h>

void main()
{
        unsigned char bit,data=0,out=0;
        int bit_marker = 0x7F;
        printf("start: \n");
        for(;;)
        {
                bit = getch();
                if(bit==0x31 || bit ==0x30)
                {
                        bit &= 0x01;
                        data <<= 1;
                        data &= 0xFE;
                        data |= bit;
                        if(data == bit_marker)
                        {
                                printf("\nbit_marker found!\n");
                                out = data;
                        } else out = 0;
                        printf("%02X ",out);
                }
        }
}

да, кстати, забываю спросить. А что это за вторые кавычки после переменной в аргументах?

Код:

printf("%d", a[i], " ");


Часовой пояс GMT +3, время: 18:19.

Powered by vBulletin
Copyright ©2000-2024, Jelsoft Enterprises Ltd.