C语言程序中,要检测一个数据是不是在变化着,应该怎么实现?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言程序中,要检测一个数据是不是在变化着,应该怎么实现?相关的知识,希望对你有一定的参考价值。
方法很多种:1)单步调试跟踪变量值。2)如上所说,用一个暂存变量保存它的值,比较。
3)在想查看它的值的地方printf();
c语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐。C语言编译器普遍存在于各种不同的操作系统中,例如Microsoft Windows、macOS、Linux、Unix等。C语言的设计影响了众多后来的编程语言,例如C++、Objective-C、Java、C#等。
C语言是一门面向过程的计算机编程语言,与C++、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速,工作量小、可读性好,易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编语言代码生成的目标程序效率低10%~20%。 参考技术A 方法很多种:1)单步调试跟踪变量值。
2)如上所说,用一个暂存变量保存它的值,比较。
3)在想查看它的值的地方printf(); 参考技术B 用一个变量保存当前值,检测时与保存的变量比较,看是否相等本回答被提问者采纳 参考技术C 1.最简单的方法,printf这个变量
2.在调试工具中设置数据断点 参考技术D #include <stdio.h>
#include <time.h>
int main ()
int static x=0; //静态变量存储时间 秒
time_t rawtime;
struct tm *info;
char buffer[80];
time( &rawtime );
info = localtime( &rawtime );
x=info->tm_sec;//存取一次秒数
while(1)
time( &rawtime );
info = localtime( &rawtime );
// printf("%d\n\r",info->tm_sec);
if((x-info->tm_sec)!=0)//判断上一次的秒数和实时的秒数是否一样
printf("%d\n\r",info->tm_sec);
x=info->tm_sec;//将实时秒数赋值给 静态x
return(0);
//我也是初学,相互交流
内容观察者
在Android项目中我们常常需要检测另一个应用私有数据的变化与否,如何检测另一个数据库应用中的数据变化,我们通过下面的案例来讲述具体的操作。
应用场景:有两个应用,一个是“01_数据库应用”,另一个是“07_内容观察者”;第二个应用监测第一个应用数据库的变化,当第一个应用数据库发生变化便即时通知第二个应用。实现方法如下:
轮询 |
若要监测数据库中数据的变化与否,我们可以在当前应用中编写一个定时器,该定时器的工作是每隔一段时间查询数据库中的数据,将查询的结果与之前查询的数据库记录进行对比从而实现监测的目的。
这种方法虽然可行,但是效率低且内存消耗大,因此并不推举。
观察者 |
ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关。
这种方式效率高内存消耗少,在项目中应该使用这种方法。
编写代码 |
01_数据库应用中定义了一个数据库person.db并注册了该数据库的内容提供者,下面我们通过内容观察者来监听该数据库应用的变化,实现代码如下:
- 新建另一个应用“07_内容观察者的原理”,在该应用的主Activity中编写例1-1代码:
例1-1 注册内容观察者
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- // 该uri路径指向数据库应用中的数据库info表
- Uri uri = Uri.parse("content://com.itheima.db/info/");
- //注册内容观察者,参数uri指向要监测的数据库info表,参数true定义了监测的范围,最后一个参数是一个内容观察者对象
- getContentResolver().registerContentObserver(uri, true,
- new MyObserver(new Handler()));
- }
例1-1实现了内容观察者的注册工作,即当数据库应用中的数据变化了该应用便可以监测到。在上述代码块中有一个参数new MyObserver(new Handler()),MyObserver是一个观察者对象,继承ContentObserver并实现了onChange方法。具体代码如例1-2所示
例1-1 MyObserver.class
- private class MyObserver extends ContentObserver{
- public MyObserver(Handler handler) {//handler 是一个消息处理器。
- super(handler);
- }
- @Override
- //当info表中的数据发生变化时则执行该方法
- public void onChange(boolean selfChange) {
- System.out.println("哈哈数据库的内容变化了");
- super.onChange(selfChange);
- }
- }
- 01_数据库应用中添加通知数据库变化的代码,具体代码如下:
当新加一条数据记录时,此时数据库info表会发生变化,因此我们需调整添加代码如例1-3所示:
例1-3
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- int code = mUriMatcher.match(uri);
- if (code == SUCCESS) {
- SQLiteDatabase db = helper.getWritableDatabase();
- long id = db.insert("info", null, values);
- db.close();
- //content://com.itheima.db/info/5
- //大吼一声,讲数据库的内容变化了。
- getContext().getContentResolver().notifyChange(uri, null);
- return Uri.parse("content://com.itheima.db/info/"+id);
- }else{
- throw new IllegalArgumentException("uri 不匹配");
- }
- }
当删除一条数据记录时,此时数据库info表会发生变化,因此我们需调整添加代码如例1-4所示:
例1-4
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- int code = mUriMatcher.match(uri);
- if (code == SUCCESS) {
- SQLiteDatabase db = helper.getWritableDatabase();
- int result = db.delete("info", selection, selectionArgs);
- db.close();
- if(result>0){
- //大吼一声,讲数据库的内容变化了。
- getContext().getContentResolver().notifyChange(uri, null);
- }
- return result;
- }else{
- throw new IllegalArgumentException("uri 不匹配");
- }
- }
以上是关于C语言程序中,要检测一个数据是不是在变化着,应该怎么实现?的主要内容,如果未能解决你的问题,请参考以下文章
MTK修改开机动画和墙纸要怎修改? 是在res.setting.c的populateDisplaychar中修改那个路径? 如下程序: