This

Тема в разделе "Общие вопросы по С и С++", создана пользователем sergey butov, 21 фев 2007.

Статус темы:
Закрыта.
  1. sergey butov

    sergey butov Гость

    Здравствуйте и сначала немного осебе ( чтобы не смеялись с вопроса ) - я учусь в компьютерной академии на программиста, а так как учица приходица на полустацыонаре, то соответственно приходица больше половины материала изучать самому. Поэтому, если уж Вам нетрудно будет помочь, то вопрос мой заключается в следующем. При написании консольных приложений, часто приходитса использовать строки. Описание же строк я пытаюсь сделать след образом:

    class name{.....


    ........ void NAME(){
    short x[]={2.67.23.56.34.........}
    //далее приходица делать следующее
    char *a=new char[n];
    short c=0;while (c<n){
    a[c]=(char)x[c];c++;}
    return;}

    Теперь сам вопрос. Пытаясь обойти использование дополнительных ресурсов, я пытаюсь сделать просто

    ........ int NAME(){
    short x[]={2.67.23.56.34.........}
    return (int)this;}

    чтобы читать массив прямо из тела программы, но я не могу понять на что конкретно указывает указатель? при попытке пролистать код я не могу найти свой массив символов, хотя пробовал возвращать и просто this и (*this). если можете порекомендовать, как правильно делать подобные вещи, очень прошу Вас выложить Ваш совет тут или, если это для Вас затруднительно, то по моему текущему почтовому адрессу:

    sergey-butov@yandex.ru
     
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Думаю, выражу общее мнение, если скажу что ничего не понятно из твоего поста - и кривой язык прекрасно дополняет невнятные name, NAME, x. Какая задача стоит? какие проблемы - ничего не описано.
    Предположу что выражение
    Код (Text):
    const char* s = "Моя строка";
    тебе может помочь.
     
  3. sergey butov

    sergey butov Гость

    На самом деле помоему я задал вопрос - "...чтобы читать массив прямо из тела программы...", а примеры, которые я привёл, конечно оставляют желать лучшего, но повторюсь - я ещё учусь и для того, чтобы Вы мне не делали зимечания по поводу величины поста, я решил их написать сокращённо. Что конкретно непонятного в этих примерах? Строки, как их пишут по классике и строки, как их пишу я - это разные вещи, но не считаете ли Вы, что мне требуется поместить здесь весь код? Допустим, что я буду писать массив сразу в char, а как тогда быть с графическими символами и например с символами кириллицы?
     
  4. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Ну так строка в С - такой же массив как и из int. Что мешает так:
    Код (Text):
    const char szText[] = {0x78, 0x79, 0x20, 7, 0};
    Повторюсь, в задаче не описано главное - что ты пытаешься сделать. Твой код здесь не нужен, нужно внятное описание проблемы. Сформулируй проблему нормальным языком, и возможно решение сразу найдется само.
    Ну что тут скажешь :)
     
  5. sergey butov

    sergey butov Гость

    ох уж мне эти венгры))).... я пытаюсь прочесть код, описанный в массиве, прямо из тела программы, но не пойму, как правильно это сделать, потому как никогда не пользовалса указателем this. у меня не получаеца сослаца на свой собственный массив и для его описания я создаю в классе функцию, используемую только для возвращаения указателя this... вот и всё)))

    да и стати, венгерской нотацией для консоли я не пользовалса.... пока что)))
     
  6. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    ох уж мне эти венгры! Накой тебе this вообще? В классе определена строка и ту хочешь получить указатель на нее? Ну так сделай метод, который будет возвращать указатель на строку, если ты считаешь, что такой подход безопасен. Корректно поставь вопрос, в конце концов


    :):):)
     
  7. sergey butov

    sergey butov Гость

    Про на кой оно мне нужно скажу только, что в кач эксперимента. Вообще в написании кода я пытаюсь отказываться не только от средств С++ но и использование средств С я тоже пытаюсь свести к минимуму.... например вместо if использовать тернарные операцыи выбора(не говоря уже о switch))). стараюсь уменьшать количество циклов и тд и тп и др... это, как показывает моя, хоть и не большая, но всё же практика, очень влияет на скорость и обьём приложения, а нащот вопроса...попытаюсь обьяснить ищо раз. вот есть массив так? (пока что неважно, какого типа данных). Как мне сделать указатель на него? Только вопрос в том, что указатель должен указывать на его расположение в теле приложения, а не на выделяемую под него статитескую или динамическую память? Я уже говорил, что пытаюсь создать, скажем так, неиспользуемую функцию, которая содержит только статический массив и возвращает указатель на себя, а потом исходя от этого указателя, пытаюсь получить доступ к этому массиву, зашитому в коде приложения, а не к памяти, выделяемой под него..... Надеюсь, что так будет понятно, потому что понятней обьяснить я уже не в силах))))

    P.S. Там, стати, в коде, который я пыталса привести я пропустил скобки функций. Это ответ на Ваш вопрос по поводу name и NAME... сорри)))
     
  8. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Гм. А заглянуть в ассемблер твой опыт позволяет?
    Код (Text):
    if (A)
    B;
    else
    C;
    Превратится в
    Код (Text):
    А;
    jz M1;
    B;
    jmp M2;
    M1:
    C;
    M2:
    На чем именно по твоему экономит тернарный ?: ?
    И даже switch добавит всего лишь дополнительный cmp ax, CONST для каждой ветки. У тебя есть реализация лучше? Хотелось бы взглянуть. При этом оптимизировать-то его конечно можно, но далеко не тернарными операциями, а байт-к-байту ручками в асме.
    По теме - как бы ты массив не объявлял, он все равно в данные ляжет. Если тебе неймется положить строку реально в код, то в MSVC это можно сделать так:
    Код (Text):
    static void MyFunc()
    {
    // mark: 4 bytes
    goto LABEL1;
    __asm
    {
    _emit 0xFF
    _emit 0xFE
    _emit 0xFD
    _emit 0xFC
    }
    LABEL1:
    ...
    Но:
    1. Это не стандарт - для других компиляторов будут (если будут) другие инструкции.
    2. Не забываем про несколько дополнительных байт заголовка функции, который компилятор всегда добавляет. Впрочем, это, кажется, можно отключить.
     
  9. sergey butov

    sergey butov Гость

    Ну вот уже чтото похожее))))..... На самом деле х86 я не знаю и пока мне нет времени (учоба) для его изучения, поэтому приходица судить по 8мибитному и использовать древние методы))). О тернарных операторах придумал не я, а вроде как препад сказал. Но соприть не буду ( хотя обычным замеров времени есть всё таки разница, правда незначительная но всё же)... чтоже касаеца массива и его чтения из тела программы то..... я же говорю, что хотел поэкспериментировать.... ведь зачем переписывать массив ещо раз если он уже есть в коде? Впрочем можно его оформить отдельным файлом и всё такое, но подгрузка не всегда приемлема да и ведь интересно же ))))) Вдобавок, я сторонник выворачивания своего компьютера наизнанку :)

    ЗЫ: Посибо)

    ЗЗЫ: MSVC rulezzz!!!
     
  10. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Разница будет только в простейшем случае:
    Код (Text):
    a = (i>0) ? i : 0;
    будет быстрее чем
    Код (Text):
    if (i>0)
    a = i;
    else
    a = 0;
    Но это и все.

    Так копировать массив как раз ты собираешься - все остальные спокойно используют строку как есть - без лишних копирований.
     
  11. sergey butov

    sergey butov Гость

    Я как раз и имел ввиду простейшие случаи, тем более что я както не умею функции всовывать в тернарные операции.... А что касаеца копирования массива, то вот как раз этого я и хотел избежать, ведь система всё равно будет создавать описываемый статический массив, то есть при том методе, который я пытаюсь использовать, массив будет один раз создаваться статически, а второй раз создаваться динамически и переписываться. на шо оно надо?)))
     
  12. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Ладно, спорить не буду - не понимаю чего ты добиваешься. Но мне кажется что ты где-то заблуждаешься про использование строк.
     
  13. sergey butov

    sergey butov Гость

    Возможно, но говорю опять же, когда, допустим, нужно использовать графические символы, то простым методом слишком уж часто придёца писать явные приведения, вот я и решыл особоне парица и просто сделать массив в котором строки описаны кодом, а как уже работать с таким массивом, это вопрос номер два))))... единственно в чом я спотыкнулса - это указатель на него
     
  14. sergey butov

    sergey butov Гость

    Для: grigsoft

    Стати, сансэй :) , а раз уж Вы шарите в х86, то можыт дадите ссылочку на таблицу работы команд по тактам, и воопще, порекомендуете литературку качнуть для начинающих? Оч хотелось бы...
     
  15. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Не, в асме я почти не шарю - хотя 10 лет назад в универе и учил, на практике опыт есть только в отладке без исходного кода. Таблицу тактов, уверен, можно найти в сети, а книжки - в мое время классикой был Абель, но тогда мало что читать было. Для обычного программиста любой книжки будет достаточно чтобы научиться читать код без особых проблем.
     
  16. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: sergey butov
    Очередное изобретение велосипеда, причем неясно какого. Вам, видимо, слова совместимость, переносимость и сопровождение кажутся пустым звуком. Хотя для троянов и вирей сопровождение до одного места
     
  17. sergey butov

    sergey butov Гость

    На самом деле что касаеца книг по асемблеру то описание команд я нашол, есть и книга, но не бесплатно и очень похоже на лохотрон ( нужно отослать смс за 0.5 доллара). А вот таблицы тактов чота я не нашол. По поводу совместимости и тд., ну чтож, я ещо не работал в команде и только начал учица, но всё ищо впереди.

    ЗЫ: С ПРАЗДНИКОМ!!!
     
  18. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-sergey butov+23:02:2007, 14:43 -->
    <span class="vbquote">(sergey butov @ 23:02:2007, 14:43 )</span><!--QuoteEBegin-->я ещо не работал в команде и только начал учица, но всё ищо впереди.
    [snapback]57048" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Да дело даже не в команде, а в страстном желании придумать очередной велосипед, ну да ладно - это твое личное дело. На счет таблицы тактов - все это на сайте Интел. Вот только порытся там придется долго. И что ты подразумеваешь под таблицей тактов? Вероятно ты хочешь узнать размер каждой команды
     
  19. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
  20. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-grigsoft+23:02:2007, 15:16 -->
    <span class="vbquote">(grigsoft @ 23:02:2007, 15:16 )</span><!--QuoteEBegin-->[snapback]57051" rel="nofollow" target="_blank[/snapback]</div>[/quote]

    Толку от количества тактов каждой команды в голом виде практически нет

    Выдержки из книги С.В.Зубкова по Assembler-у (Глава 9, посвященная оптимизации):

    Т.е. сначало надо выполнить оптимизация на высоком и среднем уровнях, а только потом переходить к тактам
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей