- Remove From My Forums
-
Question
-
I see often the reference to low or high order word when it comes to
lParam. Does it mean that lParam has two values at the same time distinguished by which side in allocated memory for that variable each of them occupies (for example left-first byte is low word/right second byte is high
word) or it means that lParam can contain either one of the formats (not both at once) depending on the functionality that places it into lParam (big endian value or little endian value)?
Answers
-
In a Win32 context lParam is 32 bits. «Word» is 16 bits, so two words can fit into a 32 bit location at the same time. The «low» word is the least significant 16 bits. The «high» word is the most significant 16 bits.
Notice that «bytes» and «endianness» have nothing to do with this. No matter where or how the low word is stored in memory it is still the low (meaning least significant) word.
-
Marked as answer by
Monday, July 19, 2010 12:12 AM
-
Marked as answer by
-
>I see often the reference to low or high order word when it comes to
lParam. Does it mean that lParam has two values at the same time distinguished by which side in allocated memory for that variable each of them occupies (for example left-first byte is low word/right second byte is high
word) or it means that lParam can contain either one of the formats (not both at once) depending on the functionality that places it into lParam (big endian value or little endian value)?An LPARAM value is a 32-bit value in a 32-bit world (and old 16-bit
Windows), and a 64-bit value in the 64-bit world.I guess you’re referring to the 16/32-bit world where it was often
used (in 16-bit Windows) to hold 2 16-bit values (a WORD is defined as
a 16-bit value) — often in conjunction with the helper macros LOWORD &
HIWORD.Does that clarify things a little?
Dave
-
Marked as answer by
Victor Stout
Monday, July 19, 2010 12:12 AM
-
Marked as answer by
|
|
There are multiple ways of achieving that, here are some of them.
Using the Bitwise and/or Shift operators
Applying a right shift in an integer will move the bits to the right, putting zeros to the left.
In the case below, it will shift the size of a short (Int16, as 16 bits).
Applying a logical AND (&) operation in an integer like 0x0000FFFF
will basically ‘cut’ the value (where it’s F
) and ignore the rest (where it’s 0
).
Remember that in the end it’s just a 0b_1 AND 0b_1 = 0b_1
operation, so any 0b_0 AND 0b_1
will result in 0b_0
.
Applying a logical OR (|) operation will basically merge the two numbers in this case, like 0b_10 | 0b_01 = 0b_11
.
Code:
uint number = 0xDEADBEEF;
//Get the higher order value.
var high = number >> 16;
Console.WriteLine($"High: {high:X}");
//Get the lower order value.
var low = number & 0xFFFF; //Or use 0x0000FFFF
Console.WriteLine($"Low: {low:X}");
//Set a high order value (you can also use 0xFFFF instead of 0x0000FFFF).
uint newHigh = 0xFADE;
number = number & 0x0000FFFF | newHigh << 16;
Console.WriteLine($"New high: {number:X}");
//Set a low order value.
uint newLow = 0xC0DE;
number = number & 0xFFFF0000 | newLow & 0x0000FFFF;
Console.WriteLine($"New low: {number:X}");
Output:
High: DEAD
Low: BEEF
New high: FADEBEEF
New low: FADEC0DE
Using FieldOffsetAttribute in a struct
C# has excellent support for variables sharing the same memory location, and bits structuring.
Since C# has no macro functions like in C, you can use the union approach to speed things up. It’s more performant than passing the variable to methods or extension methods.
You can do that by simply creating a struct with explicit layout and setting the offset of the fields:
Code:
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct WordUnion
{
[FieldOffset(0)]
public uint Number;
[FieldOffset(0)]
public ushort Low;
[FieldOffset(2)]
public ushort High;
}
public class MainClass
{
public static void Main(string[] args)
{
var x = new WordUnion { Number = 0xABADF00D };
Console.WriteLine("{0:X} {1:X} {2:X}", x.Number, x.High, x.Low);
x.Low = 0xFACE;
Console.WriteLine("{0:X} {1:X} {2:X}", x.Number, x.High, x.Low);
x.High = 0xDEAD;
Console.WriteLine("{0:X} {1:X} {2:X}", x.Number, x.High, x.Low);
}
}
Output:
ABADF00D ABAD F00D
ABADFACE ABAD FACE
DEADFACE DEAD FACE
Mind that with Visual Studio 2029 (16.7), you still may get zeros in
x.High
andx.Low
when adding the variablex
inside the Watch or by hovering your cursor on top of the variablesx.High
andx.Low
directly.
Using unsafe and pointer element access operator []
To a more akin to C programming, but in C#, use unsafe
:
Code:
unsafe
{
uint value = 0xCAFEFEED;
// x86 is using low-endian.
// So low order array number gets the low order of the value
// And high order array number gets the high order of the value
Console.WriteLine("Get low order of {0:X}: {1:X}",
value, ((ushort*) &value)[0]);
Console.WriteLine("Get high order of {0:X}: {1:X}",
value, ((ushort*) &value)[1]);
((ushort*) &value)[1] = 0xABAD;
Console.WriteLine("Set high order to ABAD: {0:X}", value);
((ushort*) &value)[0] = 0xFACE;
Console.WriteLine("Set low order to FACE: {0:X}", value);
}
Output:
Get low order of CAFEFEED: FEED
Get high order of CAFEFEED: CAFE
Set high order to ABAD: ABADFEED
Set low order to FACE: ABADFACE
Using unsafe and pointer member access operator ->
Another unsafe
approach, but this time accessing a member from the WordUnion
struct declared in a previous example:
Code:
unsafe
{
uint value = 0xCAFEFEED;
Console.WriteLine("Get low order of {0:X}: {1:X}",
value, ((WordUnion*) &value)->Low);
Console.WriteLine("Get high order of {0:X}: {1:X}",
value, ((WordUnion*) &value)->High);
((WordUnion*) &value)->High = 0xABAD;
Console.WriteLine($"Set high order to ABAD: {value:X}");
((WordUnion*) &value)->Low = 0xFACE;
Console.WriteLine($"Set low order to FACE: {value:X}");
}
Output:
Get low order of CAFEFEED: FEED
Get high order of CAFEFEED: CAFE
Set high order to ABAD: ABADFEED
Set low order to FACE: ABADFACE
Using the BitConverter class
It simply gets 16 bits (2 bytes, a short
/Int16
) from the specified number. The offset can be controlled by the second parameter.
Code:
uint value = 0xCAFEFEED;
var low = BitConverter.ToInt16(BitConverter.GetBytes(value), 0);
var high = BitConverter.ToInt16(BitConverter.GetBytes(value), 2);
Console.WriteLine($"Low: {low:X}");
Console.WriteLine($"High: {high:X}");
Output:
Low: 0xCAFE
High: 0xFEED
← →
tytus
(2006-05-12 13:51)
[0]
Доброго дня ВСЕМ! Мне нужно в программе проверять, правильно ли пользователь выбрал файл — должен быть текстовый. Делаю так:
function TMainFm.CheckFileValid(AFileName:string):boolean;
var
CData:PByte;
CHandle,CType,CFileSize,CMapHandle:Cardinal;
CFileInfo:BY_HANDLE_FILE_INFORMATION;
Count,CharCount:integer;
begin
CHandle:=CreateFile(PChar(AFileName),GENERIC_READ,
0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if CHandle=0 then
begin
MessageBox(Handle,»Error»,PChar(«Failed to open file»+#13+#10+
AFileName),MB_OK);
RaiseLastOsError;
exit;
end;
GetFileInformationByHandle(CHandle,CFileInfo);
CFileSize:=CFileInfo.nFileSizeLow+CFileInfo.nFileSizeHigh;
Count:=0;
CharCount:=0;
CMapHandle:=CreateFileMapping(CHandle,nil,PAGE_READONLY,0,CFileSize,nil);
CData:=MapViewOfFile(CMapHandle,FILE_MAP_READ,0,0,CFileSize);
while Count<CFileSize do
begin
if (CData^>31)or(CData^ in[$0D,$0A]) then inc(CharCount);
inc(CData);
inc(Count);
end;
Result:=Count=CharCount;
UnMapViewOfFile(CData);
CloseHandle(CMapHandle);
CloseHandle(CHandle);
end;
Может есть способ по проще?
← →
Сергей М. ©
(2006-05-12 13:57)
[1]
> CFileSize:=CFileInfo.nFileSizeLow+CFileInfo.nFileSizeHigh
Это
даст ошибку для любого файла размером более 65535 байт.
Читай справку и думай.
← →
Jeer ©
(2006-05-12 13:57)
[2]
Текстовый файл из одной строки без CRLF — тоже текстовый.
← →
Сергей М. ©
(2006-05-12 13:58)
[3]
+ файл в формате Unicode — тоже текстовый
← →
begin…end ©
(2006-05-12 14:05)
[4]
> Сергей М. © (12.05.06 13:57) [1]
4294967295
← →
tytus
(2006-05-12 14:06)
[5]
>Сергей М [1]
Ничего попдобного. Делаю так уже давно, файлы открываются ЛЮБОГО размера!!!
← →
balepa ©
(2006-05-12 14:07)
[6]
А может просто давать открывать только .txt ?
← →
tytus
(2006-05-12 14:08)
[7]
Ну так что, НЕТУ варианта по проще и достовернее!?
и ище — [1] файл размером около 140 метров проверяется МГНОВЕННОООО!
← →
tytus
(2006-05-12 14:11)
[8]
>balera [6]
файл может иметь ЛЮБОЕ расширение (*.trf, *.bin etc), главное чтобы его содержимое можно было просмотреть БЛОКНОТОМ или ВОРДПАДОМ.
← →
Сергей М. ©
(2006-05-12 14:14)
[9]
Ничего не знаю.
Цитата из MSDN:
nFileSizeHigh
Specifies the high-order word of the file size.
Нет никаких сведений о сдвиге этого самого high-order word в поле nFileSizeHigh на 16 разрядов влево
← →
begin…end ©
(2006-05-12 14:18)
[10]
> Сергей М. © (12.05.06 14:14) [9]
У Вас неправильный MSDN.
nFileSizeHigh
High-order part of the file size.
nFileSizeLow
Low-order part of the file size.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/by_handle_file_information_str.asp
← →
Jeer ©
(2006-05-12 14:18)
[11]
tytus (12.05.06 14:11) [8]
А ты попробуй открыть в notepad не текстовый файл и удивишься — откроется.
← →
tytus
(2006-05-12 14:18)
[12]
>[9]
Проще всего отмахаться и не проверить!!! Я поражаюсь твоей ленью!
Код в начале ветки — скопируй (даже набирать ничего не надо !!!) и проверь!
Ежели не интересно — тогда другое дело, я бы на твоем месте разобрался…
← →
Сергей М. ©
(2006-05-12 14:20)
[13]
> begin…end © (12.05.06 14:18) [10]
Точно такой же как у тебя.
И где там сказано про сдвиг ?
← →
begin…end ©
(2006-05-12 14:21)
[14]
> Сергей М. © (12.05.06 14:20) [13]
> Точно такой же как у тебя.
Судя по различию текстов, не такой же.
> И где там сказано про сдвиг ?
Нигде. А про какой сдвиг там должно быть сказано?
← →
tytus
(2006-05-12 14:21)
[15]
>Jeer [11]
Да… удивил -)))) спасибо за совет -))))
Блокнотом можно и MP3 ( да что там — VOB) просматривать!!!
Господа, спасибо всем за внимание, но МЫ НЕмного отвлеклись…
← →
Сергей М. ©
(2006-05-12 14:22)
[16]
> tytus (12.05.06 14:18) [12]
> не интересно — тогда другое дело
Действительно не интересно.
Был бы у тебя OR вместо «+» , я бы даже не обратил на это внимания.
← →
Пусик ©
(2006-05-12 14:23)
[17]
> Сергей М. © (12.05.06 13:57) [1]
>
>
> > CFileSize:=CFileInfo.nFileSizeLow+CFileInfo.nFileSizeHigh
>
>
> Это даст ошибку для любого файла размером более 65535 байт.
>
Для файлов больше 2-х Гигабайт.
> tytus (12.05.06 14:08) [7]
>
> Ну так что, НЕТУ варианта по проще и достовернее!?
У тебя достаточно оптимальный код.
Но алгоритм проверки на текст немного неверный.
Кроме #13#10 практически в любом текстовм файл встретишь #09 — TAB.
Для определения, текстовый файл или нет, не обязательно проверять весь файл.
Для того, чтобы файл был тектовым, не нужно условие, чтобы все 100% файла были отображаемыми символами. Сколько в процентном соотношении тебя устроит — определи сам, тестируя на разных файлах.
Кроме того:
CFileSize: int64;
CFileSize:=CFileInfo.nFileSizeLow+(Int64(CFileInfo.nFileSizeHigh) shl 32);
← →
Jeer ©
(2006-05-12 14:24)
[18]
tytus (12.05.06 14:21) [15]
Да какая разница — работает и ладно.
Вот если бы не работало.
← →
tytus
(2006-05-12 14:28)
[19]
>[17]
Да, Пусик, полностью стобой согласен.
Просто в требуемых для обработки файлах ТОЧНО не встретится символ
табуляции — это 100 проц.
Кроме того, файлы 100 проц. текстовые, и соотношение мне ненужно, в этом скорее всего даже выгода есть определенная.
← →
Сергей М. ©
(2006-05-12 14:29)
[20]
> begin…end © (12.05.06 14:21) [14]
> Судя по различию текстов, не такой же.
Справка от Борланда в этом контексте смыслом не отличается, согласен ?
> ро какой сдвиг там должно быть сказано?
Про тот самый ..
Для файла размером, скажем, 70000 байт значение High-order part должно быть равно $00000001, а не $00010000
← →
tytus
(2006-05-12 14:30)
[21]
>ALL. спасибо ВСЕМ, кто был неравнодушен к моему вопросу!
Если что — пишите.
← →
atruhin ©
(2006-05-12 14:31)
[22]
Абсолютно ненужная проверка! Если бы это можно было достоверно проверить…. :). Например файл в дос кодировке с таблицами в псевдографике, может использовать почти все 256 сиволов.
← →
Jeer ©
(2006-05-12 14:31)
[23]
Пробный текстовый файл ? :))
← →
begin…end ©
(2006-05-12 14:36)
[24]
> Пусик © (12.05.06 14:23) [17]
Лучше так:
Int64Rec(CFileSize).Lo := CFileInfo.nFileSizeLow;
Int64Rec(CFileSize).Hi := CFileInfo.nFileSizeHigh;
> Сергей М. © (12.05.06 14:29) [20]
> Справка от Борланда в этом контексте смыслом не отличается,
> согласен ?
Как же не отличается? В ней говорится про low/high-order word, а в MSDN — про low/high-order part. И если
32-битный
параметр называется
младшей ЧАСТЬЮ
размера файла, то я не вижу причин для того, чтобы считать действительными только 16 бит.
> Для файла размером, скажем, 70000 байт значение High-order
> part должно быть равно $00000001, а не $00010000
Для файла размером в 70000 байт значение high-order part должно быть равно нулю.
← →
Сергей М. ©
(2006-05-12 14:38)
[25]
> Пусик © (12.05.06 14:23) [17]
> Для файлов больше 2-х Гигабайт
При Int64 это будет всего лишь «ругань» компилятора, не более того.
← →
tytus
(2006-05-12 14:40)
[26]
>atruhin [22]
Псевдографика — это ///\|||||—-____, дык проверяется …
>jeer [23] ВОТ ОНО:
06-05-0900:151 481 139113496874 60 0 0 0000000000002 1391 0 0 0 0 0000000000003 1391 0 4 4 0 0000000000004 1391 0 0 0 0 4000000000005 1391 0 120 0 0 0000000000006 1391 0 0 0 0 0000000000007 1391 189 4 0 4 001600000000
06-05-0900:301 481 139113497209 60 0 0 0000000000002 1391 0 0 0 0 0000000000003 1391 0 18 18 0 0000000000004 1391 0 0 0 0 18000000000005 1391 0 121 0 0 0000000000006 1391 0 0 0 0 0000000000007 1391 235 18 0 18 001600000000 И ТАК ДАЛЕЕ — около 34 кило.
Открыто супер просмотрщиком файлов — БЛОКНОТ-ом!
← →
Сергей М. ©
(2006-05-12 14:46)
[27]
> Для файла размером в 70000 байт значение high-order part
> должно быть равно нулю
Согласен.
Меня почему-то заклинило на различиях FAT32, где размер файла не может превышать 4ГБ, и, скажем, NTFS, где нет это ограничение отсутствует.
Тем не менее сложение nFileSizeLow nFileSizeHigh бессмысленно для общего случая, при котором размер файла может превышать 4Гб.
← →
Игорь Шевченко ©
(2006-05-12 14:49)
[28]
> Кроме #13#10 практически в любом текстовм файл встретишь
> #09 — TAB.
Это вряд ли
← →
Мефисто
(2006-05-12 21:15)
[29]
tytus (12.05.06 14:30) [21]
Автар не страдайте ерундой.
#13#10
# 09
Могут и в экзешнике попасться без проблем. Без проблем в экзешнике можно и некую текстовую строчку отыскать
В данном контексте достоверно проверить является файл текстовым или нет НЕ ВОЗМОЖНО. Воспользоваться вам нужно советом выше. Открывать только файлы с типичным расширением для текстовых файлов. А уж если какойнить изврашенец My.DLL переименовал My.TXT, то уж извеняйте… Программа не телепат…
← →
Fay ©
(2006-05-13 12:38)
[30]
> if CHandle=0 then
Это чё за хрень? Сравнивать нужно с INVALID_HANDLE_VALUE
← →
Eraser ©
(2006-05-13 13:56)
[31]
> как проверить что файл текстовый?
по расширению.
← →
isasa ©
(2006-05-13 15:59)
[32]
По поводу ДОС файлов, в текстовом, может быть и $1A(^Z) и PageBreak, и много чего.
Что считать текстовым файлом(не текстом, как таковым)?
← →
isasa ©
(2006-05-13 16:03)
[33]
tytus (12.05.06 14:40) [26]
Я бы проверил на наличие адекватных позиций в колонках, или наличие правильного(одно количества в строке) разделителей.
А файл, не текстовый, а «плоский»(flat в терминах MS SQL), т.е. *.CSV
← →
Kolan ©
(2006-05-14 13:16)
[34]
Доброго дня ВСЕМ! Мне нужно в программе проверять, правильно ли пользователь выбрал файл — должен быть текстовый. Делаю так:
Не проверяй. Делай то что тебе надо, если не получается(ошибка), то сообщай, что файл неверного формата.
Делается через простой try
except
end;
← →
Мефисто
(2006-05-14 18:42)
[35]
Kolan © (14.05.06 13:16) [34]
:)))
>> Делай то что тебе надо,
try
TopenDialog.FileName := «…Word.exe»;
…
>> если не получается(ошибка)
// А ведь может и получиться
TFileStream.WriteBlock(…);
…
except
>> то сообщай, что файл неверного формата.
// Толи файл не текстовый, толи открыт другим приложением,
// Толи руки кривые, толи лыжи не едут
end;
Причин ошибок может быть куча
>> то сообщай, что файл неверного формата
А заводить пользователя (и себя) в звблуждение не нужно. Ведь ошибки могут бить и при работе с текстовым файлом.
P.S. Нет уж, лучше по старинке оградить пользователя выбором файла определенного файла через TOpenDialog к примеру. А если уж пользователю так хочется любой фалй открыть, так и быть, в списке фильтра оставлю еще масочку типа: *.*
← →
Kolan ©
(2006-05-14 19:13)
[36]
Мефисто (14.05.06 18:42) [35]
P.S. Нет уж, лучше по старинке оградить пользователя выбором файла определенного файла через TOpenDialog к примеру. А если уж пользователю так хочется любой фалй открыть, так и быть, в списке фильтра оставлю еще масочку типа: *.*
Так это понятно, тоже всегда так делаю.. А если например Drag»n»Drop.
Просто считаю, что считать символы и в процентах там что-то сравнивать вообше бред.
А в except, извесные типы ошибок. Можно по разному обработать. Ну и тд…
src: thumbs.dreamstime.com
In linguistics, word order typology is the study of the order of the syntactic constituents of a language, and how different languages can employ different orders. Correlations between orders found in different syntactic sub-domains are also of interest. The primary word orders that are of interest are the constituent order of a clause — the relative order of subject, object, and verb; the order of modifiers (adjectives, numerals, demonstratives, possessives, and adjuncts) in a noun phrase; and the order of adverbials.
Some languages use relatively restrictive word order, often relying on the order of constituents to convey important grammatical information. Others—often those that convey grammatical information through inflection—allow more flexibility, which can be used to encode pragmatic information such as topicalisation or focus. Most languages, however, have a preferred word order, and other word orders, if used, are considered «marked».
Most nominative-accusative languages—which have a major word class of nouns and clauses that include subject and object—define constituent word order in terms of the finite verb (V) and its arguments, the subject (S), and object (O).
There are six theoretically possible basic word orders for the transitive sentence. The overwhelming majority of the world’s languages are either subject-verb-object (SVO) or subject-object-verb (SOV), with a much smaller but still significant portion using verb-subject-object (VSO) word order. The remaining three arrangements are exceptionally rare, with verb-object-subject (VOS) being slightly more common than object-subject-verb (OSV), and object-verb-subject (OVS) being significantly more rare than the two preceding orders.
Video Word order
Constituent word orders
These are all possible word orders for the subject, verb, and object in the order of most common to rarest (the examples use «she» as the subject, «ate» as the verb, and «bread» as the object):
- SOV is the order used by the largest number of distinct languages; languages using it include Korean, Mongolian, Turkish, the Indo-Aryan languages and the Dravidian languages. Some, like Persian, Latin and Quechua, have SOV normal word order but conform less to the general tendencies of other such languages. A sentence glossing as «She bread ate» would be grammatically correct in these languages.
- SVO languages include English, the Romance languages, Bulgarian, Macedonian, Serbo-Croatian, Chinese and Swahili, among others. «She ate bread.»
- VSO languages include Classical Arabic, the Insular Celtic languages, and Hawaiian. «Ate she bread» is grammatically correct in these languages.
- VOS languages include Fijian and Malagasy. «Ate bread she.»
- OVS languages include Hixkaryana. «Bread ate she.»
- OSV languages include Xavante and Warao. «Bread she ate.»
Sometimes patterns are more complex: German, Dutch, Afrikaans and Frisian have SOV in subordinates, but V2 word order in main clauses, SVO word order being the most common. Using the guidelines above, the unmarked word order is then SVO.
Others, such as Latin, Greek, Persian, Romanian, Assyrian, Turkish, Finnish, and Basque have no strict word order; rather, the sentence structure is highly flexible and reflects the pragmatics of the utterance. Similarly, Japanese requires that all sentences end with V, but it could be SOV or OSV.
Topic-prominent languages organize sentences to emphasize their topic-comment structure. Nonetheless, there is often a preferred order; in Latin and Turkish, SOV is the most frequent outside of poetry, and in Finnish SVO is both the most frequent and obligatory when case marking fails to disambiguate argument roles. Just as languages may have different word orders in different contexts, so may they have both fixed and free word orders. For example, Russian has a relatively fixed SVO word order in transitive clauses, but a much freer SV / VS order in intransitive clauses. Cases like this can be addressed by encoding transitive and intransitive clauses separately, with the symbol ‘S’ being restricted to the argument of an intransitive clause, and ‘A’ for the actor/agent of a transitive clause. (‘O’ for object may be replaced with ‘P’ for ‘patient’ as well.) Thus, Russian is fixed SVO but flexible SV/VS. In such an approach, the description of word order extends more easily to languages that do not meet the criteria in the preceding section. For example, Mayan languages have been described with the rather uncommon VOS word order. However, they are ergative-absolutive languages, and the more specific word order is intransitive VS, transitive VOA, where S and O arguments both trigger the same type of agreement on the verb. Indeed, many languages that some thought had a VOS word order turn out to be ergative like Mayan.
Maps Word order
Functions of constituent word order
A fixed or prototypical word order is one out of many ways to ease the processing of sentence semantics and reducing ambiguity. One method of making the speech stream less open to ambiguity (complete removal of ambiguity is probably impossible) is a fixed order of arguments and other sentence constituents. This works because speech is inherently linear. Another method is to label the constituents in some way, for example with case marking, agreement, or another marker. Fixed word order reduces expressiveness but added marking increases information load in the speech stream, and for these reasons strict word order seldom occurs together with strict morphological marking, one counter-example being Persian.
Observing discourse patterns, it is found that previously given information (topic) tends to precede new information (comment). Furthermore, acting participants (especially humans) are more likely to be talked about (to be topic) than things simply undergoing actions (like oranges being eaten). If acting participants are often topical, and topic tends to be expressed early in the sentence, this entails that acting participants have a tendency to be expressed early in the sentence. This tendency can then grammaticalize to a privileged position in the sentence, the subject.
The mentioned functions of word order can be seen to affect the frequencies of the various word order patterns: The vast majority of languages have an order in which S precedes O and V. Whether V precedes O or O precedes V however, has been shown to be a very telling difference with wide consequences on phrasal word orders.
Knowledge of word order on the other hand can be applied to identify the thematic relations of the NPs in a clause of an unfamiliar language. If we can identify the verb in a clause, and we know that the language is strict accusative SVO, then we know that Grob smock Blug probably means that Grob is the smocker and Blug the entity smocked. However, since very strict word order is rare in practice, such applications of word order studies are rarely effective.
src: study.com
History of constituent word order
A paper by Murray Gell-Mann and Merritt Ruhlen, building on work in comparative linguistics, asserts that the distribution of word order types in the world’s languages was originally SOV. The paper compares a survey of 2135 languages with a «presumed phylogenetic tree» of languages, concluding that changes in word order tend to follow particular pathways, and the transmission of word order is to a great extent vertical (i.e. following the phylogenetic tree of ancestry) as opposed to horizontal (areal, i.e. by diffusion). According to this analysis, the most recent ancestor of currently known languages was spoken recently enough to trace the whole evolutionary path of word order in most cases.
There is speculation on how the Celtic languages developed VSO word order. An Afro-Asiatic substratum has been hypothesized, but current scholarship considers this claim untenable, not least because Afro-Asiatic and Celtic were not in contact in the relevant period.
src: i.ytimg.com
Phrase word orders and branching
The order of constituents in a phrase can vary as much as the order of constituents in a clause. Normally, the noun phrase and the adpositional phrase are investigated. Within the noun phrase, one investigates whether the following modifiers occur before or after the head noun.
- adjective (red house vs house red)
- determiner (this house vs house this)
- numeral (two houses vs houses two)
- possessor (my house vs house my)
- relative clause (the by me built house vs the house built by me)
Within the adpositional clause, one investigates whether the languages makes use of prepositions (in London), postpositions (London in), or both (normally with different adpositions at both sides).
There are several common correlations between sentence-level word order and phrase-level constituent order. For example, SOV languages generally put modifiers before heads and use postpositions. VSO languages tend to place modifiers after their heads, and use prepositions. For SVO languages, either order is common.
For example, French (SVO) uses prepositions (dans la voiture, à gauche), and places adjectives after (une voiture spacieuse). However, a small class of adjectives generally go before their heads (une grande voiture). On the other hand, in English (also SVO) adjectives almost always go before nouns (a big car), and adverbs can go either way, but initially is more common (greatly improved). (English has a very small number of adjectives that go after their heads, such as extraordinaire, which kept its position when borrowed from French.)
src: i.ytimg.com
Pragmatic word order
Some languages have no fixed word order. These languages often use a significant amount of morphological marking to disambiguate the roles of the arguments. However, some languages use a fixed word order, even if they provide a degree of marking that would support free word order. Also, some languages with free word order—such as some varieties of Datooga—combine free word order with a lack of morphological distinction between arguments.
Typologically there is a trend that highly animate actors are more likely topical than low-animate undergoers, this trend would come through even in free-word-order languages giving a statistical bias for SO order (or OS in the case of ergative systems, however ergative systems do not usually extend to the highest levels of animacy, usually giving way to some form of nominative system at least in the pronominal system). Most languages with a high degree of morphological marking have rather flexible word orders such as Turkish, Latin, Portuguese, Ancient and Modern Greek, Romanian, Hungarian, Lithuanian, Serbo-Croatian, Russian (in intransitive clauses), and Finnish. In some of those, a canonical order can still be identified, but in others this is not possible. When the word order is free, different choices of word order can be used to help identify the theme and the rheme.
Hungarian
In Hungarian, the enclitic -t marks the direct object. For «Kate ate a piece of cake«, the possibilities are:
- «Kati megevett egy szelet tortát.» (same word order as English) [«Kate ate a piece of cake.«]
- «Egy szelet tortát Kati evett meg.» (emphasis on agent [Kate]) [«A piece of cake Kate ate.«]
- «Kati evett meg egy szelet tortát.» (also emphasis on agent [Kate]) [«Kate ate a piece of cake.«]
- «Kati egy szelet tortát evett meg.» (emphasis on object [cake]) [«Kate a piece of cake ate.»]
- «Egy szelet tortát evett meg Kati.» (emphasis on number [a piece, i.e. only one piece]) [«A piece of cake ate Kate.»]
- «Megevett egy szelet tortát Kati.» (emphasis on completeness of action) [«Ate a piece of cake Kate.»]
- «Megevett Kati egy szelet tortát.» (emphasis on completeness of action) [«Ate Kate a piece of cake.«]
Portuguese
In Portuguese, clitic pronouns and commas allow many different orders:
- Eu vou entregar para você amanhã. [«I will deliver to you tomorrow.»] (same word order as English)
- Entregarei para você amanhã. [«{I} will deliver to you tomorrow.»]
- Eu lhe entregarei amanhã. [«I to you will deliver tomorrow.»]
- Entregar-lhe-ei amanhã. [«Deliver to you {I} will tomorrow.»] (mesoclisis)
- A ti, eu entregarei amanhã. [«To you I will deliver tomorrow.»]
- A ti, entregarei amanhã. [«To you deliver {I} will tomorrow.»]
- Amanhã, entregarei para você. [«Tomorrow {I} will deliver to you»]
- Poderia entregar, eu, a você amanhã? [«Could deliver I to you tomorrow?]
Braces ({ }) were used above to indicate omitted subject pronouns, which may be left implicit in Portuguese. Thanks to conjugation, the grammatical person is recovered.
Latin
In Latin, the endings of nouns, verbs, adjectives, and pronouns allow for extremely flexible order in most situations. Latin lacks articles.
The Subject, Verb, and Object can come in any order in a Latin sentence, although most often (especially in subordinate clauses) the verb comes last. Pragmatic factors, such as topic and focus, play a large part in determining the order. Thus the following sentences each answer a different question:
- Romulus Romam condidit. «Romulus founded Rome» (What did Romulus do?)
- Hanc urbem condidit Romulus. «Romulus founded this city» (Who founded this city?)
- Condidit Romam Romulus. «Romulus founded Rome» (What happened?)
Latin prose often follows the word order «Subject, Direct Object, Indirect Object, Adverb, Verb», but this is more of a guideline than a rule. Adjectives in most cases go before the noun they modify, but some categories, such as those that determine or specify (e.g. Via Appia «Appian Way»), usually follow the noun. In Classical Latin poetry, lyricists followed word order very loosely to achieve a desired scansion.
Albanian
Due to the presence of grammatical cases (nominative, genitive, dative, accusative, ablative, and in some cases or dialects vocative and locative) applied to nouns, pronouns and adjectives, the Albanian language permits a large number of positional combination of words. In spoken language a word order differing from the most common S-V-O helps the speaker putting emphasis on a word, thus changing partially the message delivered. Here it is an example:
- «Marku më dha një dhuratë (mua).» [«Mark (me) gave a present to me.», neutral narrating sentence.]
- «Marku (mua) më dha një dhuratë.» [«Mark to me (me) gave a present.», emphasis on the indirect object, probably to compare the result of the verb on different persons.]
- «Marku një dhuratë më dha (mua).» [«Mark a present (me) gave to me», meaning that Mark gave her only a present, and not something else or more presents.]
- «Marku një dhuratë (mua) më dha.» [«Mark a present to me (me) gave», meaning that Mark gave a present only to her.]
- «Më dha Marku një dhuratë (mua).» [«Gave Mark to me a present.», neutral sentence, but puts less emphasis on the subject.]
- «Më dha një dhuratë Marku (mua).» [«Gave a present to me Mark.», probably is the cause of an event being introduced later.]
- «Më dha (mua) Marku një dhurate.» [«Gave to me Mark a present.», same as above.]
- «Më dha një dhuratë mua Marku» [«(Me) gave a present to me Mark.», puts emphasis on the fact that the receiver is her and not someone else.]
- «Një dhuratë më dha Marku (mua)» [«A present gave Mark to me.», meaning it was a present and not something else.]
- «Një dhuratë Marku më dha (mua)» [«A present Mark gave to me.», puts emphasis on the fact that she got the present and someone else got something different.]
- «Një dhuratë (mua) më dha Marku.» [«A present to me gave Mark.», no particular emphasis, but can be used to list different actions from different subjects.]
- «Një dhuratë (mua) Marku më dha.» [«A present to me Mark (me) gave», remembers that at least a present was given to her by Mark.]
- «Mua më dha Marku një dhuratë.» [«To me (me) gave Mark a present.», is used when Mark gave something else to others.]
- «Mua një dhuratë më dha Marku.» [«To me a present (me) gave Mark.», emphasis on «to me» and the fact that it was a present, only one present or it was something different from usual.»]
- «Mua Marku një dhuratë më dha» [«To me Mark a present (me) gave.», Mark gave her only one present.]
- «Mua Marku më dha një dhuratë» [«To me Mark (me) gave a present.» puts emphasis on Mark. Probably the others didn’t give her present, they gave something else or the present wasn’t expected at all.]
In the aforementioned examples, «(mua)» can be omitted causing a perceivable change in emphasis, the latter being of different intensity. «Më» is always followed by the verb. Thus, a sentence consisting of a subject, a verb and two objects (a direct and an indirect one), can be expressed in six different ways without «mua», and in twenty-four different ways with «mua», adding up to thirty possible combinations.
Indo-Aryan languages
The word order of many Indo-Aryan languages can change depending on what specific implications a speaker wishes to make. These are generally aided by the use of appropriate inflectional suffixes. Consider these examples from Bengali:
- ??? ??? ???? ??? [«I that don’t know.», typical, neutral sentence]
- ??? ???? ?? ???? [«I don’t know that.», general emphasis on what isn’t known]
- ??? ??? ???? ??? [«That I don’t know.», agitation about what isn’t known]
- ??? ???? ?? ???? [«That don’t know I.», general emphasis on the person who doesn’t know]
- ???? ?? ??? ???? [«Don’t know I that.», agitation about the person who doesn’t know]
- *???? ?? ??? ???? [*»Don’t know that I.», unused]
src: en.islcollective.com
Other issues
In many languages, changes in word order occur due to topicalization or in questions. However, most languages are generally assumed to have a basic word order, called the unmarked word order; other, marked word orders can then be used to emphasize a sentence element, to indicate modality (such as an interrogative modality), or for other purposes.
For example, English is SVO (subject-verb-object), as in «I don’t know that», but OSV is also possible: «That I don’t know.» This process is called topic-fronting (or topicalization) and is common. In English, OSV is a marked word order because it emphasises the object, and is often accompanied by a change in intonation.
An example of OSV being used for emphasis:
- A: I can’t see Alice. (SVO)
- B: What about Bill?
- A: Bill I can see. (OSV, rather than I can see Bill, SVO)
Non-standard word orders are also found in poetry in English, particularly archaic or romantic terms — as the wedding phrase «With this ring, I thee wed» (SOV) or «Thee I love» (OSV) — as well as in many other languages.
Translation
Differences in word order complicate translation and language education — in addition to changing the individual words, the order must also be changed. This can be simplified by first translating the individual words, then reordering the sentence, as in interlinear gloss, or by reordering the words prior to translation.
src: i.ytimg.com
See also
- Anastrophe, change in word order
- Antisymmetry
- Information flow
src: i.ytimg.com
Notes
src: i.ytimg.com
References
src: i.ytimg.com
Further reading
Source of the article : Wikipedia
Malaja
Команда клуба
|
Люди, кто помнит, как заполнить LOWORD / HIWORD для LPARAM? pDlg->PostMessage(WM_SIZE, wparam, lparam) WM_SIZE |
||
холоднокровней, Маня, Ви не на работе |
Pu |
а зачем помнить? есть мсдн WM_SIZE Notification ——————————————————————————— The WM_SIZE message is sent to a window after its size has changed. A window receives this message through its WindowProc function. Syntax WM_SIZE WPARAM wParam Parameters wParam |
||
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. |
Pu |
а заполнить соответственно так — WORD nWidth = 100; // LOWORD(lParam); width of client area |
||
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. |
Pu |
а еще есть такой макрос — LPARAM MAKELPARAM( nWidth = 100; // LOWORD(lParam); width of client area #define MAKELONG(a, b) ((LONG)(((WORD)((DWORD_PTR)(a) & 0xffff)) | ((DWORD)((WORD)((DWORD_PTR)(b) & 0xffff))) << 16)) |
||
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. |
Malaja
Команда клуба
|
Заяц, миленький, я тебя обожаю! Именно этот макрос я и искала, т.е. я помнила, что он был, но как его звали — не помнила! А что касается побитовых сдвижек, тут я просто пас — ну просачковала я еще на лекзиях эту тему, а потом нигде не надо было, посему я это никогда не помню Говорю же — я женщина забывчивая |
||
холоднокровней, Маня, Ви не на работе |
Malaja
Команда клуба
|
Упс, а wm_size что-то не работает. ;-( LPARAM lparam = MAKELPARAM(50, 50); |
||
холоднокровней, Маня, Ви не на работе |
Pu |
The WM_SIZE message is sent to a window AFTER its size has changed. WM_SIZE — не служит для того чтобы изменить размеры виндоу. Оно посылается окну после того как размеры изменили. И в качестве параметров передается состояние окна текущее. |
||
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. |
Pu |
попробуй вот эту функцию АПИ — The MoveWindow function changes the position and dimensions of the specified window. For a top-level window, the position and dimensions are relative to the upper-left corner of the screen. For a child window, they are relative to the upper-left corner of the parent window’s client area. Syntax BOOL MoveWindow( HWND hWnd, hWnd If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError. |
||
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. |
Finch
Спокойный Пролетал мимо |
Есть еше одна функция для этих целей The SetWindowPos function changes the size, position, and Z order of a child, pop-up, or top-level window. Child, pop-up, and top-level windows are ordered according to their appearance on the screen. The topmost window receives the highest rank and is the first window in the Z order. BOOL SetWindowPos( HWND hWnd, // handle of window Parameters hWnd Identifies the window. hWndInsertAfter Identifies the window to precede the positioned window in the Z order. This parameter must be a window handle or one of the following values: Value Meaning For more information about how this parameter is used, see the following Remarks section. X Specifies the new position of the left side of the window. Y Specifies the new position of the top of the window. cx Specifies the new width of the window, in pixels. cy Specifies the new height of the window, in pixels. uFlags Specifies the window sizing and positioning flags. This parameter can be a combination of the following values: Value Meaning Return Values If the function succeeds, the return value is nonzero. Remarks If the SWP_SHOWWINDOW or SWP_HIDEWINDOW flag is set, the window cannot be moved or sized. If neither the SWP_NOACTIVATE nor SWP_NOZORDER flag is specified (that is, when the application requests that a window be simultaneously activated and its position in the Z order changed), the value specified in hWndInsertAfter is used only in the following circumstances: · Neither the HWND_TOPMOST nor HWND_NOTOPMOST flag is specified in hWndInsertAfter. An application cannot activate an inactive window without also bringing it to the top of the Z order. Applications can change an activated window’s position in the Z order without restrictions, or it can activate a window and then move it to the top of the topmost or non-topmost windows. A non-topmost window can own a topmost window, but the reverse cannot occur. Any window (for example, a dialog box) owned by a topmost window is itself made a topmost window, to ensure that all owned windows stay above their owner. |
||
Не будите спашяго дракона. |
Malaja
Команда клуба
|
Pu, Это идея, но возникает проблема — мне известны чистые размеры окна (без учета title bar). Для MoveWindow надо указать полные размеры… Т.е. как посчитать полную высоту (а точнее, как вычислить высоту title bar обычного диалога)? |
||
холоднокровней, Маня, Ви не на работе |
Finch
Спокойный Пролетал мимо |
Есть функция GetSystemMetrics. Её вызовы с параметрами SM_CYCAPTION и SM_CYMENU, и SM_CXBORDER, и SM_CYBORDER тебе дадут размеры не клиентской области. The GetSystemMetrics function retrieves various system metrics and system configuration settings. System metrics are the dimensions (widths and heights) of Windows display elements. All dimensions retrieved by GetSystemMetrics are in pixels. int GetSystemMetrics( int nIndex // system metric or configuration setting to retrieve Parameters nIndex Specifies the system metric or configuration setting to retrieve. All SM_CX* values are widths. All SM_CY* values are heights. The following values are defined: Value Meaning Return Values If the function succeeds, the return value is the requested system metric or configuration setting. Remarks System metrics may vary from display to display. Value Meaning The direction in which to arrange can be one of the following values. Value Meaning |
||
Не будите спашяго дракона. |
Malaja
Команда клуба
|
Finch, спасибочки! |
||
холоднокровней, Маня, Ви не на работе |
Malaja
Команда клуба
|
Люди, опять караул, но с другой стороны : опять же есть MDI, т.е. MainFrame снаружи и View внутри. Сверху еще болтается немодальный диалог. void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect) CRect rect1, rect2, rect3; CTest_visuView* pView = NULL; getView(&pView); // the main frame int nTBp = 0, nFS_Xp = 0, nFS_Yp = 0, nMS_Yp = 0; // width of the title bar // resize the view Не помогает ;-( Т.е. размеры окна View, судя по всему, меняются (видно из debuga), но чисто визуально не меняется ничего… А почему — не пойму, ведь Paint явно вызывается, во-первых, с помощью Invalidate, а во-вторых, флагом SWP_DRAWFRAME | SWP_FRAMECHANGED! |
||
холоднокровней, Маня, Ви не на работе |
Finch
Спокойный Пролетал мимо |
pView->SetWindowPos(&wndNoTopMost, rect1.left, rect1.top, Сразу предупрежу, Я не знаком с MFC. SWP_NOZORDER Retains the current Z order (ignores the hWndInsertAfter parameter). Ну и второе: заместо rect1.left, rect1.top можно просто указать нули, так как эти параметры игнорируются SWP_NOMOVE Retains the current position (ignores the X and Y parameters). |
||
Не будите спашяго дракона. |
Malaja
Команда клуба
|
Finch, это были остатки предыдущих попыток Но проблемы это, к сожалению, не решает… |
||
холоднокровней, Маня, Ви не на работе |
Finch
Спокойный Пролетал мимо |
Где то теряется посылка на обновление окна. Вот где. Нужно искать. |
||
Не будите спашяго дракона. |
Malaja
Команда клуба
|
да я с самого начала посмотрела — поменялись, но не перерисовались ;-( |
||
холоднокровней, Маня, Ви не на работе |
Finch
Спокойный Пролетал мимо |
В MFC не знаю, в Borland VCL сам факт изменения координат, уже вел к отрисовке, насколько я знаю. |
||
Не будите спашяго дракона. |
Finch
Спокойный Пролетал мимо |
pView->Invalidate(); Да кстати, Если pView является дочерним окном. То в принципе должно быть достаточно вызова на прорисовку родительского окна. И оно само автоматом даст команду на прорисовку всем дочерним окнам. |
||
Не будите спашяго дракона. |
Finch
Спокойный Пролетал мимо |
Вот еше нашел The WM_SIZE message is sent to a window after its size has changed. WM_SIZE Parameters fwSizeType Value of wParam. Specifies the type of resizing requested. This parameter can be one of the following values: Value Meaning nWidth Value of the low-order word of lParam. Specifies the new width of the client area. nHeight Value of the high-order word of lParam. Specifies the new height of the client area. Return Values If an application processes this message, it should return zero. Remarks If the SetScrollPos or MoveWindow function is called for a child window as a result of the WM_SIZE message, the bRedraw parameter should be nonzero to cause the window to be repainted. В нашем случае интересен выделенный абзац. Ненадо давать на прорисовку. Просто надо «bRedraw parameter should be nonzero» |
||
Не будите спашяго дракона. |
Hooter |
void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect) А почему ты говоришь об обработке сообщения WM_SIZE, а используешь OnSizing? afx_msg void OnSizing(UINT nSide, LPRECT lpRect); Обработчик WM_SIZE вообще другой вид имеет: afx_msg void OnSize(UINT nType, int cx, int cy); Имхо, ты просто не туда ткнула в ClassWizard’е // Resize the list control contained in the view to И работает без Paint или Invalidate. |
||
|
Malaja
Команда клуба
|
Finch, Hooter, Я взяла WM_SIZING для более плавной перерисовки картинки (т.к. у меня еще сверху на всем этом немодальный диалог болтается, который должен всегда находиться в правом верхнем углу View). |
||
холоднокровней, Маня, Ви не на работе |
Hooter |
Слушай, а зачем тебе вот это условие? if (nWidth1 < nWidth2 && nHight1 < nHight2) Если у тебя View меньше, чем мейнфрейм или развернут на весь мейнфрейм, то условие всегда истинно. И код, который после условия — там, где ты пытаешься резмеры изменить — не выполняется. |
||
|
Malaja
Команда клуба
|
Hooter, согласна — условие можно убрать. Но и при этом перерисовка не происходит, т.е. при старте изначально View меньше MainFrame, если я тяну контур MainFrame, то ничего не меняется, хотя я и меняю размер View. Xотя я ожидаю, что при первом же изменении размера MainFrameразмер View будет изменен (согласно кода в обработчике OnSize()). |
||
холоднокровней, Маня, Ви не на работе |
Hooter |
Тогда давай попробуем «плясать от печки», как говорится… Попробуй убрать всё в OnSizing, оставь только минимум кода. void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect) Посмотрим, что получится… |
||
|
Malaja
Команда клуба
|
Hooter, пробовала — не спасает ;-( Ситуация какая-то бредовая — если тянешь сам View, то resize срабатывает правильно и область перерисовывается. Если же тянешь MainFrame, то resize срабатывает правильно, но область View НЕ перерисовывается, а точнее перерисовывается только та область, которая не больше изначально при старте нарисованной. Если же новая область меньше изначально нарисованной, то только эта новая и перерисовывается, а остальное — нет… |
||
холоднокровней, Маня, Ви не на работе |
Джон
просто
|
Malaja, я просмотрел топики и понял, что ничего не понял. Например как View может быть меньше MianFrame? Он вообще безразмерный — те заполняет всегда клиентскую область. Самое идеальное — если у тебя есть тестовый проектик — кинь на мыло. |
||
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. |
Malaja
Команда клуба
|
Dgon, spasibochki — uge skinula! |
||
холоднокровней, Маня, Ви не на работе |
Джон
просто
|
В общем как я и думал… Речь идёт о MDI под изменением View наверно понимается изменение размеров CChildFrame. Malaja, не удержался (может ещё кому-нить будет полезно): bool CTest_visuView::moveDlg() В CChildFrame добавь: void CChildFrame::OnMove(int x, int y) CMainFrame 1. OnSize можешь выкинуть — непонятно зачем оно вообще нужно? CView* CTest_visuApp::getView() возвращает ТОЛЬКО первый View ТОЛЬКО первого документа, а если это не первый? тогда как? обычно для иттераций необходимо доп. условие поиска, тогда ты бежишь по всем въю всех документов пока не найдёшь нужный) View активного документа (именно его ты перемещаешь и видишь) 4. Вместо ON_WM_MOVING используй ON_WM_MOVE void CMainFrame::OnMove(int x, int y) 5. Вместо (CTest_visuApp*)AfxGetApp() проще использовать theApp В общем изменённый проект я тебе на мыло кину. Только я не уверен, что ты именно этого хотела — я имею ввиду привязку диалога к View. Но тут уже действует логика технического задания. |
||
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. |