No.3ベストアンサー
- 回答日時:
実データをソートしてしまいたいんですね。
int a, b; //これを入れ替える
int t = a; a = b; b = t; とするでしょ?
これと同じことですよ。
TEL_DATA a, b;
TEL_DATA t;
strncpy(t.tel, a.tel, 12); strncpy(a.tel. b.tel, 12); strncpy(b.tel, t.tel, 12);
strncpy(t.tel1, a.tel1, 202); strncpy(a.tel1, b.tel1, 202); strncpy(b.tel1, t.tel1, 202);
この部分を関数化するよね int swap(int &a, int &b); とかにして
void swap(int *a, int *b)
{
int t = *a; *a = *b; *b = t;
}
なのでこういうのがいる
void swap(TEL_DATA *a, TEL_DATA *b)
{
TEL_DATA t;
strncpy(t.tel, a->tel, 12); strncpy(a->tel. b->tel, 12); strncpy(b->tel, t.tel, 12);
strncpy(t.tel1, a->tel1, 202); strncpy(a.tel1, b->tel1, 202); strncpy(b.tel1, t->tel1, 202);
...
要素数が多いとかなり力技になるから・・
#include <string.h>
memcpy(&t, a, sizeof(TEL_DATA));
memcpy(a, b, sizeof(TEL_DATA));
memcpy(b, &t, sizeof(TEL_DATA));
全体一気にコピーしてもいいね
わかりました、テンポラリーを噛ます訳ですね
それでメモリーコピーで一気にですか
これで、通常のソートプロシージャーが使えポインターを理解していなくても解決しそうです。
ただ100万件とか大量のデーターは時間がかかりそうです!!
ちなみにアセンブラだとEDI,ESIインデックスレジを使えば済むはなしですが、
cだと理解できません。
ありがとうございました。
No.5
- 回答日時:
いや、同じですよ。
アセンブラでイメージあるならそのままのように書ける。実ソートしないってことは先に書いたようにインデックス作るって事ですよ。
こう言うものは実ソートしないね。
あとソートアルゴリズムになるからこのコードを呼ぶのは実際に「それ」が必要な時でしよ?バブルソートのように毎回見つかった時に実ソートしてたら、、orzだよね。つまりは一時的にせよインデックスがいる。なら、そのインデックス使えば実ソートはないんだから早いでしょう?
No.4
- 回答日時:
比較関数 cmp にて、
1バイト整数(char)の大小比較ではなく、
文字列(char[])の辞書順比較をするならば
return -(strncmp(キャストしたp->tel, キャストしたq->tel, 16);
参考
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/ …
No.2
- 回答日時:
struct TEL_DATA
{
char tel[16];
char tel1[202];
};
class TEL_MAN
{
TEL_DATA tel_list[100];
int tel_index[100];
int tel_num;
public:
TEL_MAN();
int sort();
TEL_DATA * operator[] (int a); // これでソートデータを得たらいいとおもう
};
{
TEL_MAN telm;
...
}
ポインターがわからないというのはよく聞くけど、アセンブラ使うならメモリーアクセスにレジスターにアドレスいれて参照するよね?これポインターだろ。
そもそも、このポインターが指すメモリー番地は単なる (intサイズ) のデータを参照できるだけであって、文字なのか、文字列なのか、数値なのか、はたまた浮動小数フォーマットデータなのかなんて、使う側しかわからないよね。
キャスト(キャスティング)は、概念的な適当な意味をもたせてるだけで実際のメモリーの中身がどうキャストしようが変化するわけでもないってこと。
ただ、代入時にコンパイラーに対してのヒントを示せるから、char c = (int)b というのはちょっとまずいんじゃない?って警告判定は出せるけれど、実際にアセンブラーレベルでは普通にしていることだからさ。 これでいいんだよと char c = (char) ((int)b)) をとコンパイラに「知っててやってるんですよ」って警告を出させないように余計なキャストするってところがあるわけ。
これ、プロセッサレベルのコードを意識できない人には、かなりの難解モードとなるんですよね。
アセンブラで書いたことがあるというのだから、単なるメモリーを私たちは意味をもたせているという概念が見えてきたら、「あらら、Cってよく考えてるよね」ってわかってくると思うよ。
兎にも角にもアセンブラで記載できる事、プロセッサ命令コードを記載できる表記がCには備わっているってことでみたら、難しいと思うことが霧が晴れるように見えてくるはず・・
頑張って・・
丁寧な回答ありがとうございます。
お示しいただいたコードは今後勉強します、私には難しいです。
アセンブラは命令数も少なく単純で判りやすかったのですが!!!
今回は一般的な、ポインター渡しでないソートコードを使い文字列ソートをします。
2カラム目をクリックしたら1カラムのデータと2カラム目のデーターをスワップして
ソート後再スワップします。
お示しのコードは、まだ検証していませんが・・・ありがとうございました。
No.1
- 回答日時:
ナンジャコリャ?
あのさ、C/C++はアセンブラに変わるものとして設計されたわけ。
なのでプロセッサ命令を知ってアセンブラを使ったことがあるなら、Cの記述はすんなりと納得できるものばかり。
ポインターにしても特別なものでもなく、キャストも便宜的なもの。
貴方のコードは基本が外れてる。
TelData に operator - () が無いのに TelData - TelData なんて、どんな結果を期待してる?
回答ありがとうございます。
アセンブラーのみで一本のゲームを作ったことはありますが・・・
私は、基本も学ばず、ぶっつけ本番でプログラムしています。
キャストが理解できません、
解決策をどうかご教授ください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
VB.NETでファイル名順にファイ...
-
DataGridViewの複数列を連動し...
-
複数キーを利用したソートの仕...
-
C# DataTableの行をソートしてD...
-
C# DataGridView のヘッダーセ...
-
C# ArrayListを二次元配列のよ...
-
あるディレクトリ内のファイル...
-
C言語・要素除去
-
DataGridViewのソートを止めたい
-
数字文字列のソート方法
-
datatablesのソートを数字順に...
-
ファイル名「1.jpg ~10.jpg~...
-
VBScriptで重複レコードを削除...
-
C++ 入力した3つのint型の整数...
-
Double型ソート方法
-
VBA基本構文の作り方 2列の...
-
C言語 配列の長さの上限
-
VBAのプログラムで、DIAG = 1# ...
-
配列を使わずに、変数名を動的...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
VB.NETでファイル名順にファイ...
-
あるディレクトリ内のファイル...
-
VBA基本構文の作り方 2列の...
-
ファイル名「1.jpg ~10.jpg~...
-
Excelですべての組合せ(重複組...
-
vbでDataTableの抽出コピー
-
C# DataTableの行をソートしてD...
-
listboxの並び替え
-
(VBA) Dir 関数で取得するファ...
-
コレクションの数値をSortで並...
-
C言語・要素除去
-
Fortran77で多次元配列を並び替...
-
C# DataTable ソートについて
-
excel VBA の条件をつけての列...
-
VBScriptで重複レコードを削除...
-
文字列をソートする方法
-
n番目に大きい数を求めるアル...
-
C言語でアナグラムを求めるプロ...
おすすめ情報