Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. y4eNick

    y4eNick New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2007
    Сообщения:
    37
    Код (Text):
    1. #include "stdio.h"
    2.  
    3. int arr[]={0,1,2,3,4};
    4.  
    5. int main(int argc, char* argv[])
    6. {
    7.     int i;
    8.              int* p;
    9.     long sum;
    10.  
    11.     p = (int*)&arr;
    12.  
    13.     for (i=0;i<5;i++)
    14.     {
    15.         sum = *p;
    16.         printf("%d\n",sum);
    17.         p++;
    18.     }
    19.      
    20.     return 0;
    21. }
    Снова приехали:

    если написать p = &arr, а не p = (int*)&arr;
    компилер говорит:
    указатель int массив int, зачем явно ещё писать (int*)?

    И в строке:
    есть какое-нибудь преобразование?
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    а зачем так сложно?
    p = arr;
    дурной тон. стандартные заголовки обычно пишут в <>.
    for (i=0; i<sizeof(arr)/sizeof(arr[0]); ++i)
     
  3. y4eNick

    y4eNick New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2007
    Сообщения:
    37
    Спасибо за совет

    А это разве не будет каждый раз в теле цикла вычисляться?
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    омфг, константное выражение вычисляется на этапе компиляции
     
  5. y4eNick

    y4eNick New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2007
    Сообщения:
    37
    Спасибо буду знать.

    Что такое "омфг"?
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Oh, My Fucking God.

    Пример:
    Код (Text):
    1. printf("%d\n", 4*2);
    assembled to:
    Код (Text):
    1. 00402419  |.  6A 08         PUSH 8                                   ; /<%d> = 8
    2. 0040241B  |.  68 E4004200   PUSH OFFSET test.??_C@_03HMFC@?$CFd?6?$A>; |format = "%d"
    3. 00402420  |.  E8 DB1F0000   CALL test.printf                         ; \printf
    4. 00402425  |.  83C4 08       ADD ESP, 8
    даже без оптимизации )
     
  7. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Не понимаю... где ошибка?

    Код (Text):
    1. // test.cpp : Defines the entry point for the console application.
    2. //
    3.  
    4. #include "stdafx.h"
    5. #include "malloc.h"
    6.  
    7. bool EncodeString(wchar_t *src, wchar_t *dest)
    8. {
    9.     //--- determine length of the strings
    10.     size_t wsrclen  = wcslen(src);
    11.     size_t wdestlen = wcslen(dest);
    12.  
    13.     //--- check it
    14.     if (wsrclen >= wdestlen) return false;
    15.  
    16.     //--- encode by xor
    17.     for (int i = 0; i <= wsrclen; i++)
    18.     {
    19.         *dest = (*src) ^ i;
    20.         dest++;
    21.         src++;
    22.     }
    23.  
    24.     return true;
    25. }
    26.  
    27. int _tmain(int argc, _TCHAR* argv[])
    28. {
    29.     wchar_t *string = {L"test_string"};
    30.     wchar_t *encoded = (wchar_t *)malloc(12);
    31.     wchar_t *decoded = (wchar_t *)malloc(12);
    32.  
    33.     wprintf(L"\norigin: %s",string);
    34.     EncodeString(string,encoded);
    35.     wprintf(L"\nencoded: %s",encoded);
    36.     EncodeString(encoded,decoded);
    37.     wprintf(L"\ndecoded: %s",decoded);
    38.  
    39.     for(;;){}
    40.  
    41.     return 0;
    42. }
    выводит

    origin: test_string
    encoded: tdqw[vruagm♂
    decoded: ????????????

    Должно в decoded вернуть test_string
     
  8. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    (глюк)
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    slow
    1) malloc(sizeof(wchar_t) * 12)
    2) что возвращает wcslen(dest), иил по другому - чем инициализирован dest, чтобы вычислять его длину?
     
  10. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    slow
    Код (Text):
    1. //#include "stdafx.h"
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <tchar.h>
    5. #include "malloc.h"
    6.  
    7. bool EncodeString(wchar_t *src, wchar_t *dest, size_t len)
    8. {
    9. //--- determine length of the strings
    10. //size_t wsrclen  = wcslen(src);
    11. //size_t wdestlen = wcslen(dest);
    12.  
    13. //--- check it
    14. //if (wsrclen >= wdestlen) return false;
    15.  
    16. //--- encode by xor
    17. for (int i = 0; i < len; i++)
    18. {
    19. *dest = (*src) ^ i;
    20. dest++;
    21. src++;
    22. }
    23.  
    24. return true;
    25. }
    26.  
    27. int _tmain(int argc, _TCHAR* argv[])
    28. {
    29. wchar_t *string = {L"test_string"};
    30. wchar_t *encoded = (wchar_t *)malloc(12);
    31. wchar_t *decoded = (wchar_t *)malloc(12);
    32.  
    33. wprintf(L"\norigin: %s",string);
    34. EncodeString(string,encoded,12);
    35. wprintf(L"\nencoded: %s",encoded);
    36. EncodeString(encoded,decoded,12);
    37. wprintf(L"\ndecoded: %s",decoded);
    38.  
    39. for(;;){}
    40.  
    41. return 0;
    42. }
    hint: decoded изначально не известно чем заполнено (скорее всего 0)
     
  11. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    q_q
    Спасибо огромное! Давно уже не писал на Си (лет пять, наверное, если не больше), даже основы забыл :dntknw:
    1) исправил
    2) проверку на длину dest убрал, это я хотел сделать проверку на корректность, переделал под выделение памяти внутри функции
    и заработало
     
  12. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    censored
    там памяти еще мало выделялось, надо 12 * sizeof(wchar_t). Спасибо
     
  13. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    slow
    хотел сделать проверку на корректность
    Можно так:
    Код (Text):
    1. if (0 != IsBadWritePtr(dest, sizeof(wchar_t) * (wcslen(src) + 1)))
    2.   return false;
     
  14. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    q_q
    спасибо!
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    q_q
    IsBadXXPtr уже объявлены как устаревшие и не рекомендуемые к использованию.
    Теперь рекомендуется либо просто проверять указатель на корректность (ptr != NULL) (+ принадлежность диапазону адресов в режиме ядра), либо самому обрамлять логику SEH'ом.
     
  16. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Несколько простых вопросов:
    1. Как записать асмовые команды: not и sar(именно её а не shr)?
    2. Если нужно досрочно завершить текущую петлю цикла for, сделает ли это break?
    Пока все.
     
  17. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    1. _asm not ?
    2. да.
     
  18. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    2. Спасибо
    1. Я ожидал что то вроде "!"

    К примеру
    char* t[2];
    ...
    t[1]= !t[0]
    такое сработает?
     
  19. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    1. x=~x;
    2. x>>= n; // если x - знаковый тип
    если беззнаковый:
    x= (signed <type>)x >> n;
     
  20. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Спасибо