How the struct definition works?
2 ビュー (過去 30 日間)
古いコメントを表示
I am trying to understand the code written by someone in matlab and I am attempting to understand and to translate it to fortran. The sample code I am reading is shown below . if bucket1.bucket1 is not equal to 'y' then its structure will be character, integer as defined before. However, if its equal to y then bucket1.bucket1 will equal to 5,1 which is integer, integer. When compiling in matlab there is no error and his code works. However when writting in fortran, there is structure definition collision. How come matlab is not complaining when character is replaced with a number? Bucket1 is defined as a list of characters and bucket2 is defined as list of integers.
samples = struct(...
'bucket1' {'x','y','z'}...
'bucket2' {1,2,3})
if bucket1.bucket1 == 'y'
bucket1.bucket1 = 5
end
disp(bucket1.bucket1)
1 件のコメント
Stephen23
2019 年 1 月 28 日
編集済み: Stephen23
2019 年 1 月 28 日
The code refers to a variable named bucket1, but nowhere is such a variable defined. The code only define a structure named samples, which is never referred to again after being defined.
"if bucket1.bucket1 is not equal to 'y' then..."
bucket1.bucket1 does not exist in the code you have shown us, and trying to refer to a non-existant variable will throw an error. Also the vague "if its equal to y" does not reflect that eq actually performs element-wise comparison of all characters, so it would be better described as "if all characters are 'y' ... ".
"Bucket1 is defined as a list of characters and bucket2 is defined as list of integers."
MATLAB does not have a "list" class. Basic MATLAB data classes are described in the MATLAB documentation:
"How the struct definition works?"
Read the struct help: it explains that that struct call will create a 1x3 struct with two fields, which in this case initially contain scalar character arrays and scalar numerics. The size of the cell arrays determines the structure size. Nothing in that structure resembles a "list" (i.e. character arrays and numeric arrays are not container variables, as "lists" are in many programming languages).
"How come matlab is not complaining when character is replaced with a number?"
Simple: every field's content is totally independent from all other structure elements and all other fields. There is absolutely no requirement in MATLAB for the same field of different structure elements to have the same data class.
採用された回答
mathango
2019 年 1 月 28 日
2 件のコメント
Walter Roberson
2019 年 1 月 28 日
you can %ptr and once you have figured out the needed type pass the %ptr to a conversion routine .
その他の回答 (1 件)
Image Analyst
2019 年 1 月 28 日
The code will not run unless bucket1 has been declared/instantiated somewhere else.
A structure "samples" was created, but never used in the code that you posted.
Assuming bucket1 was also created in the same way that samples was, it would (assuming several syntax errors are corrected) check to see if bucket1.bucket1 was the character y, and if so, it would change the type of the variable to a double 5. This is not, in my opinion, a good idea (to change the class of a variable from one type to another).
4 件のコメント
Walter Roberson
2019 年 1 月 28 日
MATLAB is dynamically typed. It is completely valid in MATLAB to have
AA = true;
AA = 5;
AA = 'hello';
AA = figure();
in a single function. It might not result in the clearest of code, but it is completely valid and will not result in any error.
In the case of "complete" variables such as I have given here, AA, not indexed or structure referenced, it is not possible to prevent a completely different data type from overwriting the variable.
In cases where there is some kind of indexing, such as
AA.param1 = 'hello';
AA.param1 = 5;
then there are ways in MATLAB where the change of data type could potentially be caught, but they would have to be specifically programmed.
There are cases, such as calling into an external library, where it can be appropriate that the same name might refer to different data types at different times. For example,
inputs.functname = 'add';
inputs.numparam = 2;
inputs.param1 = 3;
inputs.param2 = 5;
result = call_library('my_external_library', inputs);
inputs.functname = 'display';
inputs.numparam = 2;
inputs.param1 = '%d';
inputs.param2 = result;
result = call_library('my_external_library', inputs);
Walter Roberson
2019 年 1 月 28 日
MATLAB does not have the equivalent of fortran COMMON declaring a block of memory with mixed data to be potentially different sizes and types.
MATLAB does have the ability to reinterpret arrays of basic numeric datatypes as if they were other data types. For example,
>> typecast(uint8([1 2 3 4]),'uint16')
ans =
1×2 uint16 row vector
513 1027
However this is limited. You cannot, for example,
typecast('hello', 'uint8')
whereas in fortran you could have two different COMMON declarations with the same name but one declaring character and one declaring numeric. The size of characters is not completely defined in MATLAB... but the definitions that are present are as-if characters are 16 bits in MATLAB.
参考
カテゴリ
Help Center および File Exchange で Fortran with MATLAB についてさらに検索
製品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!