Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Поменять константу строки в скомпилированном файле.

Дали исполняемый jar-ник. Просят поменять значение константы в одном из файликов.
Исходников нет.

Нашли в каком .class файле эта константа. Для этого декомпильнули всё, что внутри джарника нашли.

Теперь встаёт вопрос как подменить константу. в .class файле константа явно не хранится.

Перекомпильнуть только один файл явно не получится ибо будет ругань на импорты.
Декомпильнуть, подправить константу и компильнуть весь проект ?
А как ? я ж не знаю как он вообще собирался? какие либы там используются

Посоветуйте простой способ
Ответ:
redwhite90
Нашли в каком .class файле эта константа.
...
в .class файле константа явно не хранится.

Константы хранятся явно в .class файлах, в constant pool'e.
Так вы нашли в каком .class файле эта константа хранится, или нет?
Сначала надо найти .class файл, затем подредактировать любым бинарным редактором.
Если константа числовая, то просто меняете байты. Если строковая, то еще надо скорректировать байты, содержащие длину строки.
Вопрос: Константы (литералы) типа int

Всем привет!)
У меня возможно глупый вопросы, но мы же все когда-то учились)
Вопрос такой: когда компилятор встречает целочисленную константу(литерал) превышающую максимальное значение int'a, то тогда это константы будет является константой большего типа, например unsigned int, потом long, потом unsigned long и так далее?
Заранее спасибо)
Ответ:
Сообщение от Alex_Sava
когда компилятор встречает целочисленную константу(литерал) превышающую максимальное значение int'a, то тогда это константы будет является константой большего типа, например unsigned int, потом long, потом unsigned long и так далее?
Почти. По стандарту (п 6.4.4.1.5, с89 и старше) она будет первого ближайшего типа, в котором можно представить значение.
The type of an integer constant is the first of the corresponding list in which its value canbe represented.
Прогрессия типов определяется таблицой (оттуда же):
СуффиксДесятичная константаВосьмеричная или шестнадцатиричная константа
нетint -> long int -> long long intint -> unsigned int -> long int -> unsigned long int -> long long int -> unsigned long long int
u или Uunsigned int -> unsigned long int -> unsigned long long intunsigned int -> unsigned long int -> unsigned long long int
l или Llong int -> long long intlong int -> unsigned long int -> long long int -> unsigned long long int
u или U и l или L одновременноunsigned long int -> unsigned long long intunsigned long int -> unsigned long long int
ll или LLlong long intlong long int -> unsigned long long int
u или U и ll или LL одновременноunsigned long long intunsigned long long int

Не по теме:

P.S. кто знает, как в этом проклятом теге таблицы делать многострочный текст в ячейках?

Вопрос: Как создать константу?

Я обратил внимание на один файл lib-e.lsp. Там собраны как
функции, так и константы. Например _pi = 3.141592....
Если все так просто, то можно ли создавать свои константы и
ввести в файл lib-e.lsp? И будут ли это реальные константы?
Не изменятся ли они (не могут ли они быть изменены) в
программе? Как вообще можно создать константу? Переменную
_pi я бы создал. (setq _pi 3.1415926535897932). А какая функция
превращает ее в константу? И возможно ли обратное преобразование?
Ответ:
Сообщение от vlisp
где никакие переменные и константы не нужны
- точнее, где "переменные" являются константами. Но это в чистом функциональном языке, а Лисп таковым не является.

Добавлено через 1 минуту
Сообщение от geh
И возможно ли обратное преобразование?
- нет, невозможно.

Добавлено через 45 секунд

Не по теме:

_Ivana, не нужно обострять противоречия. Худой мир лучше доброй ссоры.

Вопрос: Как передать значение константе?

в дев си -все работает, но в визуал ругается на х(((((
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <fstream>
#include <iostream> 
#include <string.h> 
 using namespace std; 
 
int main()
{
  
 std::ifstream fin("D:\\opo.txt",ios_base::in);
 
 
int x = 0;
while (!fin.eof())
{
char c;
fin.get(c);
x++;
}
 
 
 
char buffer[x];//пишет х-только константа должна быть
char stroka[98];
 
 
cout<<x;
std::ifstream fino("D:\\opo.txt");
     cin.getline(stroka,98);
     while(fino.getline(buffer,x)) { 
if(strstr(buffer,stroka )) 
cout << buffer << endl; 
} 
 
   return 0;
}
как тогда передать значение константе??? или что сделать чтобы визуал не ругался??
Ответ:
C++
1
char buffer[x];//пишет х-только константа должна быть
В данном случае, правильно пишет.
Размером массива должна быть "константа времени компиляции".
В Dev-C++, скорее всего, у Вас компилятор GCC(MinGW),
и там это компилируется из-за того, что доступно расширение VLA.
Если Вы добавите компилятору ключик -pedantic-errors,
то оно уже не должно компилироваться (хотя есть исключение на некоторых версиях компилятора).
Сообщение от Светлана Слонь
как тогда передать значение константе?
Используйте std::vector или работайте с памятью вручную.
Вопрос: Область видимости констант

Здравствуйте.
Есть файл const.php, где будут хранится все константы(пока есть только одна)
PHP
1
2
3
<?php
define("SERVER", $_SERVER['HTTP_X_FORWARDED_PROTO'].'://'.$_SERVER['HTTP_HOST']);
?>
и есть index.php, в котором я хочу вывести эту константу таким нехитрым способом
PHP
1
2
3
4
<?php
include ('const.php');
echo SERVER;
?>
Собственно, меня интересует какими способами можно сделать константу SERVER доступной для файла index.php без необходимости прописывать include/require?

П.С. неудобно же в каждом файле, который вызывает данную константу прописывать include
Ответ:
Сообщение от Noob Progaramm
П.С. неудобно же в каждом файле, который вызывает данную константу прописывать include
Единая точка входа - один раз подключил и успокоился.
Вопрос: Правильное размещение констант

Перед тем как создавать тему, погуглил, но нигде ответа не нашел.
Вопрос такой: Есть набор констант, которые могут использоваться в нескольких классах. Где их разместить?
Есть несколько вариантов:
1)(нашел в гугле) размещать константы в интерфейсе, но идеологически данный подход неверен.
2)(отсебятина) Разместить константы в отдельном классе, например:
Java
1
2
3
4
5
6
7
public class SomeConstants{
 
public static final String CONST_1 = "блинчики!";
public static final String CONST_2 = "готовить";
public static final String CONST_3 = "Лень";
 
}
соответственно вызов в нужном классе:
Java
1
2
3
4
5
6
7
public class SomeClass{
 
private void printSomeString(){
   System.out.println(SomeConstants.CONST_3 + SomeConstants.CONST_2 + SomeConstants.CONST_1);
}
 
}
Есть ли более правильный подход для размещения констант, дабы не дублировать их в каждом классе, который их использует?
Ответ:
Сообщение от Frizka
Есть ли более правильный подход для размещения констант, дабы не дублировать их в каждом классе, который их использует?
Нет. Но в некоторых случаях можно использовать enum:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public enum SomeConstants {
 
    CONST_1("блинчики!"),
    CONST_2("готовить"),
    CONST_3("Лень");
    
    private final String message;
 
    private SomeConstants(String message) {
        this.message = message;
    }
    
    public String message() {
        return message;
    }
}
Java
1
2
3
4
5
6
7
8
9
public final class SomeClass {
 
    private void printSomeString(){
        System.out.println(SomeConstants.CONST_3.message()
                + SomeConstants.CONST_2.message()
                + SomeConstants.CONST_1.message()
        );
    }
}
Но там есть свои нюансы, поэтому, если ты не знаешь, что делаешь, просто используй статические поля класса, как в твоём примере.
Вопрос: Как записать динамический массив записей в константу ?

Вот к примеру так можно представить record в константе - >
       TzData = record
          H: Byte;        
          R: Word;      
          S: AnsiString;  
          O: Byte;        
          M: Byte;        
        end;
       TArrZData = array of TzData;
     const     AKR_R      : TzData = (H : 1; R : 12; S : 'Xxxxxx';   O : 3; M : 114);


А если у меня массив TArrZData то как его представить в качестве константы ?

Логичным мне показалось так (Code:) но это не принемается.
    const
    XXC : array[0..2] of TzData = (AKR_R, AKR_R, AKR_R);
Сообщение отредактировано: Jiro -
Ответ:
Цитата MBo @
В константу ничего записать нельзя, на то она и константа.

Дык а кто говорит что можно ...

Добавлено
А статический можно в константе представить ?
     
    TzData = record
          H: Byte;        
          R: Word;      
          S: AnsiString;  
          O: Byte;        
          M: Byte;        
        end;
       TArrZData = array[0..2] of TzData;


Добавлено
Всё разобрался, там я натупил как обычно :P
Сообщение отредактировано: Jiro -
Вопрос: Красивая работа с константами

Делаю ревью старого кода, и задался мыслю как сделать более красиво.

Суть вопроса. В проекте задается большое количество констант, в том числе и многомерных массивов, которые описывают конструктивные особенности некого большого объекта. Все константы в текущем варианте вынесены в отдельный модуль и используются прямым обращением из различных частей проекта.
Во время ревью произвел разбивку констант на группы, но оставил все в одном модуле.

Вопрос: как бы вы поступили далее, оставили так или сформировали классы со статическими переменными или свойствами..?
И каков механизм вызова стат. свойств?

// константы
TProp = class
...
class property A...
...

TApp = class
 Prop : TProp;
...

// Как Обратится к свойству А, если экземпляр класса TProp не создавался
App : TApp;
...
App := TApp.Create;
App.Prop.A //?
Ответ: kaktus1983,

это у тебя уже не константы получаются, а глобальные переменные
Вопрос: "Глобальная" константа как в голых Сях или Pascal'e

Вот ей богу - гуглил я, но не разобрался: как (в каком месте солюшина) можно объявить/инициализировать константу , что бы можно было обратиться по её имени в любом модуле "проекта" (program.cs + 3-4 form's.cs)?

В голых Сях я писал
Код C
1
#define MyConst = "HelloWorld"
в хедере, тут: говорят: "В C# нет понятия хедеров."
Теория классов для меня, к моему глубокому, недопонятна: если объявить класс, который будет содержать public-инициализированые переменные, как этот класс подключить/использовать его членов во всех модулях? Что именно придется написать в using(или куда)?

Например, если создать в Program.cs такое:
Код C#
1
2
3
4
static class Consts
{
    public const string firstConst = "HelloWorld";
}
Куда/как его "проинклудить" в модулях форм, что бы иметь возможность сделать в конструкторе формы нечто вроде:
Код C#
1
2
Consts myConsts = new Consts();
MessageBox.Show(myConsts.firstConst1);
Или вообще - ткните носом в ссылку с "доходчивым" объяснением сего вопроса (в масштабе 3+ модулей, а не одного!)

PS. В константе хочу захардкодить имя файла-конфига. Если в .NET для этого есть какое-то более "элегантное" решение - готов попытаться освоить его, вместо "глобальных констант". Вы только "направьте" пож. в правильное русло))
Ответ: На самом деле все достаточно просто:

1. Чтобы иметь под рукой константы, нужно создать статический класс, с публичными статическими свойствами.
2. Чтобы обращаться к статическому классу не нужно создавать его объект.
3. Чтобы обращаться к тому или иному классу, нужно чтобы классы находились в одном пространстве имен, либо нужно в классе,который вызывает, подключить пространство имен класса, который нужно вызвать.

на практике выглядит так:

Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms; //подключение пространства имен form
 
using Tools; // подключение пространства имен вашего статического класса 
 
namespace ProgramName
{
    public partial class frmMain : Form
    {
         ....
         if (date == C.NullDateTimeValue )
         ....
     }
}
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Tools
{
    public static class C
    {
        public static DateTime NullDateTimeValue = DateTime.MinValue;
     }
}
Вопрос: (php) Как константе присвоить значение переменной или функции

Как константе присвоить значение переменной или функции:
if(!class_exists(semt)) { abstract class semt {
    const prt = функция или переменная
}}

?
Ответ:
Сергей Арбузов
MikkiMouse,
запихивает это значение в глобальную константу через define, а внутри класса присвоить константе класса значение глобальной константы....


Отличное решение, спасибо.